javax.transaction,
org.eclipse.osgi.framework.console,
ch.qos.logback.classic,
- org.opendaylight.controller.clustering.services
+ org.opendaylight.controller.clustering.services,
+ org.opendaylight.controller.sal.core,
+ org.apache.felix.dm
</Import-Package>
- <Service-Component>
- OSGI-INF/component.xml
- </Service-Component>
+ <Bundle-Activator>
+ org.opendaylight.controller.clustering.test.internal.Activator
+ </Bundle-Activator>
</instructions>
<manifestLocation>${project.basedir}/META-INF</manifestLocation>
</configuration>
<artifactId>clustering.services</artifactId>
<version>0.4.0-SNAPSHOT</version>
</dependency>
+ <dependency>
+ <groupId>org.opendaylight.controller</groupId>
+ <artifactId>sal</artifactId>
+ <version>0.4.0-SNAPSHOT</version>
+ </dependency>
</dependencies>
</project>
--- /dev/null
+
+/*
+ * Copyright (c) 2013 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.controller.clustering.test.internal;
+
+import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase;
+import org.opendaylight.controller.clustering.services.IClusterServices;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.apache.felix.dm.Component;
+
+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
+ *
+ */
+ public void destroy() {
+ }
+
+ /**
+ * 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
+ */
+ public Object[] getGlobalImplementations() {
+ Object[] res = { SimpleClient.class };
+ return res;
+ }
+
+ /**
+ * 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
+ * @param imp Implementation class that is being configured,
+ * needed as long as the same routine can configure multiple
+ * implementations
+ */
+ public void configureGlobalInstance(Component c, Object imp) {
+ if (imp.equals(SimpleClient.class)) {
+ // export the service for Apps and Plugins
+ c.setInterface(new String[] { org.eclipse.osgi.framework.console.CommandProvider.class.getName() },
+ null);
+ c.add(createServiceDependency().setService(IClusterServices.class)
+ .setCallbacks("setIClusterServices", "unsetIClusterServices")
+ .setRequired(true));
+ }
+ }
+}
+++ /dev/null
-<?xml version="1.0" encoding="UTF-8"?>
-<scr:component xmlns:scr="http://www.osgi.org/xmlns/scr/v1.1.0"
- activate="startUp"
- deactivate="shutDown"
- name="org.opendaylight.controller.clustering.test.internal.SimpleClient">
- <implementation class="org.opendaylight.controller.clustering.test.internal.SimpleClient"/>
-
- <service>
- <!-- Exports, can be multiple-->
- <provide interface="org.eclipse.osgi.framework.console.CommandProvider"/>
- </service>
-
- <!-- Imports, can be multiple -->
- <reference name="IClusterServices"
- bind="setIClusterServices"
- unbind="unsetIClusterServices"
- cardinality="1..1"
- interface="org.opendaylight.controller.clustering.services.IClusterServices"/>
-</scr:component>
/**\r
* Composite transformer which aggregates multiple implementation and selects\r
* the one which accepts the input.\r
- * \r
- * \r
+ *\r
+ *\r
* @author Tony Tkacik\r
- * \r
+ *\r
* @param <I>\r
* Input class for transformation\r
* @param <P>\r
@Override\r
public int compare(TransformerWithPriority<I, P> o1,\r
TransformerWithPriority<I, P> o2) {\r
- return Integer.compare(o1.priority, o2.priority);\r
+ return Integer.valueOf(o1.priority).compareTo(Integer.valueOf(o2.priority));\r
}\r
\r
};\r
SimpleConditionalTransformer<I, P> {\r
final int priority;\r
final SimpleConditionalTransformer<I, P> transformer;\r
- \r
+\r
public TransformerWithPriority(\r
SimpleConditionalTransformer<I, P> transformer, int priority) {\r
this.priority = priority;\r
this.transformer = transformer;\r
}\r
- \r
+\r
@Override\r
public int hashCode() {\r
final int prime = 31;\r
+ ((transformer == null) ? 0 : transformer.hashCode());\r
return result;\r
}\r
- \r
+\r
@Override\r
public boolean equals(Object obj) {\r
if (this == obj)\r
return false;\r
return true;\r
}\r
- \r
+\r
@Override\r
public boolean isAcceptable(I input) {\r
return transformer.isAcceptable(input);\r
}\r
- \r
+\r
@Override\r
public P transform(I input) {\r
return transformer.transform(input);\r
}\r
- \r
- \r
- \r
- \r
- \r
+\r
+\r
+\r
+\r
+\r
}\r
}\r
<booleanAttribute key="default" value="true"/>
<booleanAttribute key="default_auto_start" value="true"/>
<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.opendaylight.controller.clustering.stub,org.opendaylight.controller.protocol_plugins.stub"/>
<booleanAttribute key="includeOptional" value="false"/>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dorg.osgi.framework.system.packages.extra=sun.reflect,sun.reflect.misc,sun.misc -Dosgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator -Dlogback.configurationFile=${project_loc:/distribution.opendaylight}/src/main/resources/configuration/logback.xml -Dorg.eclipse.gemini.web.tomcat.config.path=${project_loc:/distribution.opendaylight}/src/main/resources/configuration/tomcat-server.xml -Dosgi.frameworkClassPath=file:${project_loc:/distribution.opendaylight}/../p2site/target/repository/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar,file:${project_loc:/distribution.opendaylight}/../p2site/target/repository/plugins/org.eclipse.virgo.kernel.equinox.extensions_3.6.0.RELEASE.jar,file:${project_loc:/distribution.opendaylight}/../p2site/target/repository/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="target_bundles" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,chameleon-mbeans@default:default,com.google.gson@default:default,com.springsource.org.aopalliance@default:default,com.sun.jersey.client@default:default,com.sun.jersey.core@default:default,com.sun.jersey.jersey-server@default:default,com.sun.jersey.json@default:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.activation@default:default,javax.annotation@default:default,javax.ejb@default:default,javax.el@default:default,javax.mail.glassfish@default:default,javax.persistence@default:default,javax.servlet.jsp.jstl.impl@default:default,javax.servlet.jsp.jstl@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml.rpc@default:default,jcl.over.slf4j@default:default,log4j.over.slf4j@default:default,org.apache.catalina.ha@default:false,org.apache.catalina.tribes@default:false,org.apache.catalina@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.coyote@default:false,org.apache.el@default:default,org.apache.felix.dependencymanager.shell@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.jasper@default:false,org.apache.juli.extras@default:default,org.apache.tomcat.api@default:default,org.apache.tomcat.util@default:false,org.codehaus.jettison.jettison@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.util@default:default,org.eclipse.gemini.web.core@default:default,org.eclipse.gemini.web.extender@default:default,org.eclipse.gemini.web.tomcat@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.virgo.kernel.equinox.extensions@default:false,org.eclipse.virgo.util.common@default:default,org.eclipse.virgo.util.io@default:default,org.eclipse.virgo.util.math@default:default,org.eclipse.virgo.util.osgi.manifest@default:default,org.eclipse.virgo.util.osgi@default:default,org.eclipse.virgo.util.parser.manifest@default:default,org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec@default:default,org.springframework.aop@default:default,org.springframework.asm@default:default,org.springframework.beans@default:default,org.springframework.context.support@default:default,org.springframework.context@default:default,org.springframework.core@default:default,org.springframework.expression@default:default,org.springframework.security.config@default:default,org.springframework.security.core@default:default,org.springframework.security.taglibs@default:default,org.springframework.security.web@default:default,org.springframework.transaction@default:default,org.springframework.web.servlet@default:default,org.springframework.web@default:default,slf4j.api@default:default"/>
+<stringAttribute key="target_bundles" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,chameleon-mbeans@default:default,com.google.gson@default:default,com.springsource.org.aopalliance@default:default,com.sun.jersey.client@1:default,com.sun.jersey.core@1:default,com.sun.jersey.jersey-server@1:default,com.sun.jersey.json@1:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.activation@default:default,javax.annotation@default:default,javax.ejb@default:default,javax.el@default:default,javax.mail.glassfish@default:default,javax.persistence@default:default,javax.servlet.jsp.jstl.impl@default:default,javax.servlet.jsp.jstl@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml.rpc@default:default,jcl.over.slf4j@default:default,log4j.over.slf4j@default:default,org.apache.catalina.ha@default:false,org.apache.catalina.tribes@default:false,org.apache.catalina@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.coyote@default:false,org.apache.el@default:default,org.apache.felix.dependencymanager.shell@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.jasper@default:false,org.apache.juli.extras@default:default,org.apache.tomcat.api@default:default,org.apache.tomcat.util@default:false,org.codehaus.jettison.jettison@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.util@default:default,org.eclipse.gemini.web.core@default:default,org.eclipse.gemini.web.extender@default:default,org.eclipse.gemini.web.tomcat@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.virgo.kernel.equinox.extensions@default:false,org.eclipse.virgo.util.common@default:default,org.eclipse.virgo.util.io@default:default,org.eclipse.virgo.util.math@default:default,org.eclipse.virgo.util.osgi.manifest@default:default,org.eclipse.virgo.util.osgi@default:default,org.eclipse.virgo.util.parser.manifest@default:default,org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec@default:default,org.springframework.aop@default:default,org.springframework.asm@default:default,org.springframework.beans@default:default,org.springframework.context.support@default:default,org.springframework.context@default:default,org.springframework.core@default:default,org.springframework.expression@default:default,org.springframework.security.config@default:default,org.springframework.security.core@default:default,org.springframework.security.taglibs@default:default,org.springframework.security.web@default:default,org.springframework.transaction@default:default,org.springframework.web.servlet@default:default,org.springframework.web@default:default,slf4j.api@default:default"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<stringAttribute key="workspace_bundles" value="org.opendaylight.controller.arphandler@default:default,org.opendaylight.controller.clustering.services-implementation@default:default,org.opendaylight.controller.clustering.services@default:default,org.opendaylight.controller.clustering.stub@default:default,org.opendaylight.controller.clustering.test@default:default,org.opendaylight.controller.commons.northbound@default:default,org.opendaylight.controller.configuration.implementation@default:default,org.opendaylight.controller.configuration@default:default,org.opendaylight.controller.containermanager.implementation@default:default,org.opendaylight.controller.containermanager@default:default,org.opendaylight.controller.devices.web@default:default,org.opendaylight.controller.flowprogrammer.northbound@default:default,org.opendaylight.controller.flows.web@default:default,org.opendaylight.controller.forwarding.staticrouting.northbound@default:default,org.opendaylight.controller.forwarding.staticrouting@default:default,org.opendaylight.controller.forwardingrulesmanager.implementation@default:default,org.opendaylight.controller.forwardingrulesmanager@default:default,org.opendaylight.controller.hosttracker.implementation@default:default,org.opendaylight.controller.hosttracker.northbound@default:default,org.opendaylight.controller.hosttracker@default:default,org.opendaylight.controller.logging.bridge@default:default,org.opendaylight.controller.protocol_plugins.openflow@default:default,org.opendaylight.controller.protocol_plugins.stub@default:default,org.opendaylight.controller.routing.dijkstra_implementation@default:default,org.opendaylight.controller.sal.implementation@default:default,org.opendaylight.controller.sal@default:default,org.opendaylight.controller.samples.loadbalancer.northbound@default:default,org.opendaylight.controller.samples.loadbalancer@default:default,org.opendaylight.controller.samples.simpleforwarding@default:default,org.opendaylight.controller.security@default:false,org.opendaylight.controller.statistics.northbound@default:default,org.opendaylight.controller.statisticsmanager.implementation@default:default,org.opendaylight.controller.statisticsmanager@default:default,org.opendaylight.controller.subnets.northbound@default:default,org.opendaylight.controller.switchmanager.implementation@default:default,org.opendaylight.controller.switchmanager.northbound@default:default,org.opendaylight.controller.switchmanager@default:default,org.opendaylight.controller.thirdparty.com.sun.jersey.jersey-servlet@default:default,org.opendaylight.controller.thirdparty.net.sf.jung2@default:default,org.opendaylight.controller.thirdparty.org.openflow.openflowj@default:default,org.opendaylight.controller.topology.northbound@default:default,org.opendaylight.controller.topology.web@default:default,org.opendaylight.controller.topologymanager@default:default,org.opendaylight.controller.troubleshoot.web@default:default,org.opendaylight.controller.usermanager@default:default,org.opendaylight.controller.web@default:default"/>
+<stringAttribute key="workspace_bundles" value="org.opendaylight.controller.arphandler@default:default,org.opendaylight.controller.clustering.services-implementation@default:default,org.opendaylight.controller.clustering.services@default:default,org.opendaylight.controller.clustering.test@default:default,org.opendaylight.controller.commons.northbound@default:default,org.opendaylight.controller.concepts@default:default,org.opendaylight.controller.configuration.implementation@default:default,org.opendaylight.controller.configuration@default:default,org.opendaylight.controller.containermanager.implementation@default:default,org.opendaylight.controller.containermanager@default:default,org.opendaylight.controller.devices.web@default:default,org.opendaylight.controller.flowprogrammer.northbound@default:default,org.opendaylight.controller.flows.web@default:default,org.opendaylight.controller.forwarding.staticrouting.northbound@default:default,org.opendaylight.controller.forwarding.staticrouting@default:default,org.opendaylight.controller.forwardingrulesmanager.implementation@default:default,org.opendaylight.controller.forwardingrulesmanager@default:default,org.opendaylight.controller.hosttracker.implementation@default:default,org.opendaylight.controller.hosttracker.northbound@default:default,org.opendaylight.controller.hosttracker@default:default,org.opendaylight.controller.logging.bridge@default:default,org.opendaylight.controller.protocol_plugins.openflow@default:default,org.opendaylight.controller.routing.dijkstra_implementation@default:default,org.opendaylight.controller.sal.implementation@default:default,org.opendaylight.controller.sal@default:default,org.opendaylight.controller.samples.loadbalancer.northbound@default:default,org.opendaylight.controller.samples.loadbalancer@default:default,org.opendaylight.controller.samples.simpleforwarding@default:default,org.opendaylight.controller.security@default:false,org.opendaylight.controller.statistics.northbound@default:default,org.opendaylight.controller.statisticsmanager.implementation@default:default,org.opendaylight.controller.statisticsmanager@default:default,org.opendaylight.controller.subnets.northbound@default:default,org.opendaylight.controller.switchmanager.implementation@default:default,org.opendaylight.controller.switchmanager.northbound@default:default,org.opendaylight.controller.switchmanager@default:default,org.opendaylight.controller.thirdparty.com.sun.jersey.jersey-servlet@default:default,org.opendaylight.controller.thirdparty.net.sf.jung2@default:default,org.opendaylight.controller.thirdparty.org.openflow.openflowj@default:default,org.opendaylight.controller.topology.northbound@default:default,org.opendaylight.controller.topology.web@default:default,org.opendaylight.controller.topologymanager@default:default,org.opendaylight.controller.troubleshoot.web@default:default,org.opendaylight.controller.usermanager@default:default,org.opendaylight.controller.web@default:default"/>
</launchConfiguration>
<booleanAttribute key="default" value="true"/>
<booleanAttribute key="default_auto_start" value="true"/>
<intAttribute key="default_start_level" value="4"/>
+<stringAttribute key="deselected_workspace_plugins" value="org.opendaylight.controller.clustering.stub,org.opendaylight.controller.protocol_plugins.stub"/>
<booleanAttribute key="includeOptional" value="false"/>
<listAttribute key="org.eclipse.debug.ui.favoriteGroups">
<listEntry value="org.eclipse.debug.ui.launchGroup.debug"/>
<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Declipse.ignoreApp=true -Dosgi.noShutdown=true -Dorg.osgi.framework.system.packages.extra=sun.reflect,sun.reflect.misc,sun.misc -Dosgi.hook.configurators.include=org.eclipse.virgo.kernel.equinox.extensions.hooks.ExtensionsHookConfigurator -Dlogback.configurationFile=${project_loc:/distribution.opendaylight}/src/main/resources/configuration/logback.xml -Dorg.eclipse.gemini.web.tomcat.config.path=${project_loc:/distribution.opendaylight}/src/main/resources/configuration/tomcat-server.xml -Dosgi.frameworkClassPath=file:${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.equinox.launcher_1.3.0.v20120522-1813.jar,file:${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.virgo.kernel.equinox.extensions_3.6.0.RELEASE.jar,file:${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/.bundle_pool/plugins/org.eclipse.osgi_3.8.1.v20120830-144521.jar"/>
<stringAttribute key="pde.version" value="3.3"/>
<booleanAttribute key="show_selected_only" value="false"/>
-<stringAttribute key="target_bundles" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,chameleon-mbeans@default:default,com.google.gson@default:default,com.springsource.org.aopalliance@default:default,com.sun.jersey.client@default:default,com.sun.jersey.core@default:default,com.sun.jersey.jersey-server@default:default,com.sun.jersey.json@default:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.activation@default:default,javax.annotation@default:default,javax.ejb@default:default,javax.el@default:default,javax.mail.glassfish@default:default,javax.persistence@default:default,javax.servlet.jsp.jstl.impl@default:default,javax.servlet.jsp.jstl@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml.rpc@default:default,jcl.over.slf4j@default:default,log4j.over.slf4j@default:default,org.apache.catalina.ha@default:false,org.apache.catalina.tribes@default:false,org.apache.catalina@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.coyote@default:false,org.apache.el@default:default,org.apache.felix.dependencymanager.shell@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.jasper@default:false,org.apache.juli.extras@default:default,org.apache.tomcat.api@default:default,org.apache.tomcat.util@default:false,org.codehaus.jettison.jettison@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.util@default:default,org.eclipse.gemini.web.core@default:default,org.eclipse.gemini.web.extender@default:default,org.eclipse.gemini.web.tomcat@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.virgo.kernel.equinox.extensions@default:false,org.eclipse.virgo.util.common@default:default,org.eclipse.virgo.util.io@default:default,org.eclipse.virgo.util.math@default:default,org.eclipse.virgo.util.osgi.manifest@default:default,org.eclipse.virgo.util.osgi@default:default,org.eclipse.virgo.util.parser.manifest@default:default,org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec@default:default,org.springframework.aop@default:default,org.springframework.asm@default:default,org.springframework.beans@default:default,org.springframework.context.support@default:default,org.springframework.context@default:default,org.springframework.core@default:default,org.springframework.expression@default:default,org.springframework.security.config@default:default,org.springframework.security.core@default:default,org.springframework.security.taglibs@default:default,org.springframework.security.web@default:default,org.springframework.transaction@default:default,org.springframework.web.servlet@default:default,org.springframework.web@default:default,slf4j.api@default:default"/>
+<stringAttribute key="target_bundles" value="ch.qos.logback.classic@default:default,ch.qos.logback.core@default:default,chameleon-mbeans@default:default,com.google.gson@default:default,com.springsource.org.aopalliance@default:default,com.sun.jersey.client@1:default,com.sun.jersey.core@1:default,com.sun.jersey.jersey-server@1:default,com.sun.jersey.json@1:default,jackson-core-asl@default:default,jackson-jaxrs@default:default,jackson-mapper-asl@default:default,javax.activation@default:default,javax.annotation@default:default,javax.ejb@default:default,javax.el@default:default,javax.mail.glassfish@default:default,javax.persistence@default:default,javax.servlet.jsp.jstl.impl@default:default,javax.servlet.jsp.jstl@default:default,javax.servlet.jsp@default:default,javax.servlet@default:default,javax.xml.rpc@default:default,jcl.over.slf4j@default:default,log4j.over.slf4j@default:default,org.apache.catalina.ha@default:false,org.apache.catalina.tribes@default:false,org.apache.catalina@default:default,org.apache.commons.fileupload@default:default,org.apache.commons.io@default:default,org.apache.commons.lang3@default:default,org.apache.coyote@default:false,org.apache.el@default:default,org.apache.felix.dependencymanager.shell@default:default,org.apache.felix.dependencymanager@default:default,org.apache.felix.gogo.command@default:default,org.apache.felix.gogo.runtime@default:default,org.apache.felix.gogo.shell@default:default,org.apache.jasper@default:false,org.apache.juli.extras@default:default,org.apache.tomcat.api@default:default,org.apache.tomcat.util@default:false,org.codehaus.jettison.jettison@default:default,org.eclipse.equinox.cm@default:default,org.eclipse.equinox.console@default:default,org.eclipse.equinox.ds@1:true,org.eclipse.equinox.launcher@default:default,org.eclipse.equinox.util@default:default,org.eclipse.gemini.web.core@default:default,org.eclipse.gemini.web.extender@default:default,org.eclipse.gemini.web.tomcat@default:default,org.eclipse.jdt.core.compiler.batch@default:default,org.eclipse.osgi.services@default:default,org.eclipse.osgi@-1:true,org.eclipse.virgo.kernel.equinox.extensions@default:false,org.eclipse.virgo.util.common@default:default,org.eclipse.virgo.util.io@default:default,org.eclipse.virgo.util.math@default:default,org.eclipse.virgo.util.osgi.manifest@default:default,org.eclipse.virgo.util.osgi@default:default,org.eclipse.virgo.util.parser.manifest@default:default,org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec@default:default,org.springframework.aop@default:default,org.springframework.asm@default:default,org.springframework.beans@default:default,org.springframework.context.support@default:default,org.springframework.context@default:default,org.springframework.core@default:default,org.springframework.expression@default:default,org.springframework.security.config@default:default,org.springframework.security.core@default:default,org.springframework.security.taglibs@default:default,org.springframework.security.web@default:default,org.springframework.transaction@default:default,org.springframework.web.servlet@default:default,org.springframework.web@default:default,slf4j.api@default:default"/>
<booleanAttribute key="tracing" value="false"/>
<booleanAttribute key="useCustomFeatures" value="false"/>
<booleanAttribute key="useDefaultConfigArea" value="true"/>
-<stringAttribute key="workspace_bundles" value="org.opendaylight.controller.arphandler@default:default,org.opendaylight.controller.clustering.services-implementation@default:default,org.opendaylight.controller.clustering.services@default:default,org.opendaylight.controller.clustering.stub@default:default,org.opendaylight.controller.clustering.test@default:default,org.opendaylight.controller.commons.northbound@default:default,org.opendaylight.controller.configuration.implementation@default:default,org.opendaylight.controller.configuration@default:default,org.opendaylight.controller.containermanager.implementation@default:default,org.opendaylight.controller.containermanager@default:default,org.opendaylight.controller.devices.web@default:default,org.opendaylight.controller.flowprogrammer.northbound@default:default,org.opendaylight.controller.flows.web@default:default,org.opendaylight.controller.forwarding.staticrouting.northbound@default:default,org.opendaylight.controller.forwarding.staticrouting@default:default,org.opendaylight.controller.forwardingrulesmanager.implementation@default:default,org.opendaylight.controller.forwardingrulesmanager@default:default,org.opendaylight.controller.hosttracker.implementation@default:default,org.opendaylight.controller.hosttracker.northbound@default:default,org.opendaylight.controller.hosttracker@default:default,org.opendaylight.controller.logging.bridge@default:default,org.opendaylight.controller.protocol_plugins.openflow@default:default,org.opendaylight.controller.protocol_plugins.stub@default:default,org.opendaylight.controller.routing.dijkstra_implementation@default:default,org.opendaylight.controller.sal.implementation@default:default,org.opendaylight.controller.sal@default:default,org.opendaylight.controller.samples.loadbalancer.northbound@default:default,org.opendaylight.controller.samples.loadbalancer@default:default,org.opendaylight.controller.samples.simpleforwarding@default:default,org.opendaylight.controller.security@default:false,org.opendaylight.controller.statistics.northbound@default:default,org.opendaylight.controller.statisticsmanager.implementation@default:default,org.opendaylight.controller.statisticsmanager@default:default,org.opendaylight.controller.subnets.northbound@default:default,org.opendaylight.controller.switchmanager.implementation@default:default,org.opendaylight.controller.switchmanager.northbound@default:default,org.opendaylight.controller.switchmanager@default:default,org.opendaylight.controller.thirdparty.com.sun.jersey.jersey-servlet@default:default,org.opendaylight.controller.thirdparty.net.sf.jung2@default:default,org.opendaylight.controller.thirdparty.org.openflow.openflowj@default:default,org.opendaylight.controller.topology.northbound@default:default,org.opendaylight.controller.topology.web@default:default,org.opendaylight.controller.topologymanager@default:default,org.opendaylight.controller.troubleshoot.web@default:default,org.opendaylight.controller.usermanager@default:default,org.opendaylight.controller.web@default:default"/>
+<stringAttribute key="workspace_bundles" value="org.opendaylight.controller.arphandler@default:default,org.opendaylight.controller.clustering.services-implementation@default:default,org.opendaylight.controller.clustering.services@default:default,org.opendaylight.controller.commons.northbound@default:default,org.opendaylight.controller.concepts@default:default,org.opendaylight.controller.configuration.implementation@default:default,org.opendaylight.controller.configuration@default:default,org.opendaylight.controller.containermanager.implementation@default:default,org.opendaylight.controller.containermanager@default:default,org.opendaylight.controller.devices.web@default:default,org.opendaylight.controller.flowprogrammer.northbound@default:default,org.opendaylight.controller.flows.web@default:default,org.opendaylight.controller.forwarding.staticrouting.northbound@default:default,org.opendaylight.controller.forwarding.staticrouting@default:default,org.opendaylight.controller.forwardingrulesmanager.implementation@default:default,org.opendaylight.controller.forwardingrulesmanager@default:default,org.opendaylight.controller.hosttracker.implementation@default:default,org.opendaylight.controller.hosttracker.northbound@default:default,org.opendaylight.controller.hosttracker@default:default,org.opendaylight.controller.logging.bridge@default:default,org.opendaylight.controller.protocol_plugins.openflow@default:default,org.opendaylight.controller.routing.dijkstra_implementation@default:default,org.opendaylight.controller.sal.implementation@default:default,org.opendaylight.controller.sal@default:default,org.opendaylight.controller.samples.loadbalancer.northbound@default:default,org.opendaylight.controller.samples.loadbalancer@default:default,org.opendaylight.controller.samples.simpleforwarding@default:default,org.opendaylight.controller.security@default:false,org.opendaylight.controller.statistics.northbound@default:default,org.opendaylight.controller.statisticsmanager.implementation@default:default,org.opendaylight.controller.statisticsmanager@default:default,org.opendaylight.controller.subnets.northbound@default:default,org.opendaylight.controller.switchmanager.implementation@default:default,org.opendaylight.controller.switchmanager.northbound@default:default,org.opendaylight.controller.switchmanager@default:default,org.opendaylight.controller.thirdparty.com.sun.jersey.jersey-servlet@default:default,org.opendaylight.controller.thirdparty.net.sf.jung2@default:default,org.opendaylight.controller.thirdparty.org.openflow.openflowj@default:default,org.opendaylight.controller.topology.northbound@default:default,org.opendaylight.controller.topology.web@default:default,org.opendaylight.controller.topologymanager@default:default,org.opendaylight.controller.troubleshoot.web@default:default,org.opendaylight.controller.usermanager@default:default,org.opendaylight.controller.web@default:default"/>
</launchConfiguration>
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<?pde version="3.8"?><target name="opendaylight" sequenceNumber="3">
+<?pde version="3.8"?><target name="opendaylight" sequenceNumber="4">
<locations>
<location includeAllPlatforms="false" includeConfigurePhase="true" includeMode="slicer" includeSource="true" type="InstallableUnit">
-<unit id="com.springsource.org.aopalliance" version="1.0.0"/>
+<unit id="org.apache.jasper" version="7.0.32.v201211201952"/>
+<unit id="javax.servlet.jsp.jstl.impl" version="1.2.0.v201210211230"/>
+<unit id="org.springframework.context" version="3.1.3.RELEASE"/>
+<unit id="org.eclipse.gemini.web.extender" version="2.2.0.RELEASE"/>
+<unit id="jackson-jaxrs" version="1.9.8"/>
+<unit id="com.sun.jersey.jersey-server" version="1.17.0"/>
+<unit id="org.eclipse.jdt.core.compiler.batch" version="3.8.0.I20120518-2145"/>
+<unit id="org.springframework.web" version="3.1.3.RELEASE"/>
+<unit id="com.google.gson" version="2.1.0"/>
+<unit id="org.springframework.security.config" version="3.1.3.RELEASE"/>
+<unit id="org.springframework.transaction" version="3.1.3.RELEASE"/>
+<unit id="org.eclipse.virgo.util.math" version="3.6.0.RELEASE"/>
<unit id="org.apache.el" version="7.0.32.v201211081135"/>
-<unit id="org.apache.felix.dependencymanager" version="3.1.0"/>
+<unit id="org.springframework.web.servlet" version="3.1.3.RELEASE"/>
<unit id="org.apache.felix.dependencymanager.shell" version="3.0.1"/>
+<unit id="log4j.over.slf4j" version="1.7.2"/>
+<unit id="com.springsource.org.aopalliance" version="1.0.0"/>
+<unit id="javax.annotation" version="1.1.0.v201209060031"/>
+<unit id="jcl.over.slf4j" version="1.7.2"/>
+<unit id="javax.mail.glassfish" version="1.4.1.v201108011116"/>
+<unit id="slf4j.api" version="1.7.2"/>
+<unit id="org.springframework.expression" version="3.1.3.RELEASE"/>
+<unit id="jackson-mapper-asl" version="1.9.8"/>
+<unit id="org.eclipse.gemini.web.tomcat" version="2.2.0.RELEASE"/>
<unit id="org.apache.felix.gogo.command" version="0.8.0.v201108120515"/>
+<unit id="org.springframework.asm" version="3.1.3.RELEASE"/>
+<unit id="org.eclipse.equinox.ds" version="1.4.0.v20120522-1841"/>
+<unit id="org.eclipse.equinox.console" version="1.0.0.v20120522-1841"/>
+<unit id="org.apache.catalina" version="7.0.32.v201211201336"/>
+<unit id="chameleon-mbeans" version="1.0.0"/>
+<unit id="javax.servlet.jsp.jstl" version="1.2.0.v201105211821"/>
<unit id="org.apache.felix.gogo.runtime" version="0.8.0.v201108120515"/>
-<unit id="org.apache.felix.gogo.shell" version="0.8.0.v201110170705"/>
+<unit id="org.apache.tomcat.util" version="7.0.32.v201211201952"/>
+<unit id="jackson-core-asl" version="1.9.8"/>
<unit id="javax.activation" version="1.1.0.v201211130549"/>
-<unit id="org.apache.jasper" version="7.0.32.v201211201952"/>
-<unit id="org.apache.juli.extras" version="7.0.32.v201211081135"/>
+<unit id="org.eclipse.gemini.web.core" version="2.2.0.RELEASE"/>
+<unit id="org.eclipse.virgo.util.osgi" version="3.6.0.RELEASE"/>
+<unit id="org.apache.commons.io" version="2.3.0"/>
+<unit id="javax.servlet.jsp" version="2.2.0.v201112011158"/>
<unit id="org.apache.tomcat.api" version="7.0.32.v201211081135"/>
-<unit id="org.apache.catalina" version="7.0.32.v201211201336"/>
-<unit id="org.apache.catalina.ha" version="7.0.32.v201211201952"/>
-<unit id="org.apache.catalina.tribes" version="7.0.32.v201211201952"/>
+<unit id="com.sun.jersey.core" version="1.17.0"/>
+<unit id="org.springframework.security.taglibs" version="3.1.3.RELEASE"/>
+<unit id="org.springframework.security.web" version="3.1.3.RELEASE"/>
+<unit id="com.sun.jersey.client" version="1.17.0"/>
+<unit id="org.springframework.aop" version="3.1.3.RELEASE"/>
<unit id="org.apache.coyote" version="7.0.32.v201211201952"/>
-<unit id="org.apache.tomcat.util" version="7.0.32.v201211201952"/>
+<unit id="org.eclipse.virgo.kernel.equinox.extensions" version="3.6.0.RELEASE"/>
+<unit id="org.eclipse.osgi.services" version="3.3.100.v20120522-1822"/>
<unit id="org.eclipse.virgo.util.common" version="3.6.0.RELEASE"/>
+<unit id="com.sun.jersey.json" version="1.17.0"/>
+<unit id="org.eclipse.equinox.util" version="1.0.400.v20120522-2049"/>
+<unit id="org.springframework.core" version="3.1.3.RELEASE"/>
<unit id="org.apache.commons.fileupload" version="1.2.2"/>
-<unit id="org.apache.commons.io" version="2.3.0"/>
+<unit id="org.codehaus.jettison.jettison" version="1.3.3"/>
+<unit id="org.eclipse.virgo.util.io" version="3.6.0.RELEASE"/>
+<unit id="org.apache.felix.gogo.shell" version="0.8.0.v201110170705"/>
<unit id="org.apache.commons.lang3" version="3.1.0"/>
<unit id="org.eclipse.equinox.cm" version="1.0.400.v20120522-1841"/>
-<unit id="org.eclipse.equinox.console" version="1.0.0.v20120522-1841"/>
-<unit id="jackson-mapper-asl" version="1.9.8"/>
-<unit id="org.eclipse.equinox.ds" version="1.4.0.v20120522-1841"/>
-<unit id="org.eclipse.jdt.core.compiler.batch" version="3.8.0.I20120518-2145"/>
+<unit id="org.springframework.beans" version="3.1.3.RELEASE"/>
+<unit id="javax.servlet" version="3.0.0.v201112011016"/>
<unit id="org.eclipse.equinox.launcher" version="1.3.0.v20120522-1813"/>
-<unit id="org.eclipse.virgo.kernel.equinox.extensions" version="3.6.0.RELEASE"/>
-<unit id="org.eclipse.equinox.util" version="1.0.400.v20120522-2049"/>
-<unit id="org.eclipse.gemini.web.core" version="2.2.0.RELEASE"/>
-<unit id="org.eclipse.gemini.web.extender" version="2.2.0.RELEASE"/>
-<unit id="org.eclipse.gemini.web.tomcat" version="2.2.0.RELEASE"/>
-<unit id="com.google.gson" version="2.1.0"/>
-<unit id="org.eclipse.virgo.util.io" version="3.6.0.RELEASE"/>
-<unit id="jackson-core-asl" version="1.9.8"/>
-<unit id="javax.ejb" version="3.1.1.v201204261316"/>
-<unit id="org.eclipse.virgo.util.parser.manifest" version="3.6.0.RELEASE"/>
<unit id="javax.persistence" version="2.0.4.v201112161009"/>
-<unit id="javax.servlet.jsp.jstl" version="1.2.0.v201105211821"/>
-<unit id="org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec" version="1.0.1.Final"/>
-<unit id="javax.servlet.jsp.jstl.impl" version="1.2.0.v201210211230"/>
-<unit id="javax.el" version="2.2.0.v201108011116"/>
-<unit id="javax.annotation" version="1.1.0.v201209060031"/>
-<unit id="javax.mail.glassfish" version="1.4.1.v201108011116"/>
-<unit id="javax.xml.rpc" version="1.1.0.v201005080400"/>
-<unit id="jackson-jaxrs" version="1.9.8"/>
-<unit id="jcl.over.slf4j" version="1.7.2"/>
-<unit id="com.sun.jersey.client" version="1.17.0"/>
-<unit id="com.sun.jersey.core" version="1.17.0"/>
-<unit id="com.sun.jersey.json" version="1.17.0"/>
-<unit id="com.sun.jersey.jersey-server" version="1.17.0"/>
-<unit id="org.codehaus.jettison.jettison" version="1.3.3"/>
-<unit id="javax.servlet.jsp" version="2.2.0.v201112011158"/>
-<unit id="log4j.over.slf4j" version="1.7.2"/>
-<unit id="ch.qos.logback.classic" version="1.0.9"/>
-<unit id="ch.qos.logback.core" version="1.0.9"/>
-<unit id="org.eclipse.virgo.util.math" version="3.6.0.RELEASE"/>
-<unit id="org.eclipse.virgo.util.osgi.manifest" version="3.6.0.RELEASE"/>
-<unit id="org.eclipse.osgi.services" version="3.3.100.v20120522-1822"/>
<unit id="org.eclipse.osgi" version="3.8.1.v20120830-144521"/>
-<unit id="org.eclipse.virgo.util.osgi" version="3.6.0.RELEASE"/>
-<unit id="chameleon-mbeans" version="1.0.0"/>
-<unit id="javax.servlet" version="3.0.0.v201112011016"/>
-<unit id="slf4j.api" version="1.7.2"/>
-<unit id="org.springframework.aop" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.asm" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.beans" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.context" version="3.1.3.RELEASE"/>
+<unit id="ch.qos.logback.core" version="1.0.9"/>
+<unit id="javax.ejb" version="3.1.1.v201204261316"/>
+<unit id="org.apache.catalina.ha" version="7.0.32.v201211201952"/>
<unit id="org.springframework.context.support" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.core" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.expression" version="3.1.3.RELEASE"/>
+<unit id="org.eclipse.virgo.util.osgi.manifest" version="3.6.0.RELEASE"/>
+<unit id="javax.xml.rpc" version="1.1.0.v201005080400"/>
+<unit id="ch.qos.logback.classic" version="1.0.9"/>
<unit id="org.springframework.security.core" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.security.config" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.security.taglibs" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.security.web" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.transaction" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.web" version="3.1.3.RELEASE"/>
-<unit id="org.springframework.web.servlet" version="3.1.3.RELEASE"/>
-<repository location="https://jenkins.opendaylight.org/controller/job/controller-merge/lastSuccessfulBuild/artifact/opendaylight/distribution/p2site/target/repository/"/>
+<unit id="javax.el" version="2.2.0.v201108011116"/>
+<unit id="org.apache.juli.extras" version="7.0.32.v201211081135"/>
+<unit id="org.jboss.spec.javax.transaction.jboss-transaction-api_1.1_spec" version="1.0.1.Final"/>
+<unit id="org.apache.catalina.tribes" version="7.0.32.v201211201952"/>
+<unit id="org.eclipse.virgo.util.parser.manifest" version="3.6.0.RELEASE"/>
+<unit id="org.apache.felix.dependencymanager" version="3.1.0"/>
+<repository location="http://nexus.opendaylight.org/content/repositories/controllerp2site/"/>
</location>
</locations>
</target>
return this.nodeConnector.getNode();
}
- /**
- * @return the NodeId
- */
- public Long getnodeconnectornodeId() {
- return (Long) this.nodeConnector.getNode().getID();
- }
-
- /**
- * @return the port
- */
- public Short getnodeconnectorportId() {
- return (Short) this.nodeConnector.getID();
- }
-
/**
* @return the DataLayerAddress
*/
Assert.assertTrue(hostnodeconnector_2.isV6Host());\r
Assert.assertTrue(hostnodeconnector_2.getnodeConnector().equals(nc1));\r
Assert.assertTrue(hostnodeconnector_2.getnodeconnectorNode().equals(node));\r
- Assert.assertTrue(node.getID().equals(hostnodeconnector_2.getnodeconnectornodeId()));\r
- Assert.assertTrue(hostnodeconnector_2.getnodeconnectorportId().equals((short)2));\r
+ Assert.assertTrue(node.equals(hostnodeconnector_2.getnodeconnectorNode()));\r
} catch (ConstructionException e) {\r
Assert.assertTrue(false);\r
}\r
* wasn't created for this host in the controller. This would cause
* arphandler not to know where to send the ARP 2. The host facing port is
* down 3. The IP host doesn't exist or is not responding to ARP requests
- *
+ *
* Conditions 1 and 2 above can be recovered if ARP is sent when the
* relevant L3 interface is added or the port facing host comes up. Whenever
* L3 interface is added or host facing port comes up, ARP will be sent to
* hosts in this list.
- *
+ *
* We can't recover from condition 3 above
*/
private ArrayList<ARPPending> failedARPReqList = new ArrayList<HostTracker.ARPPending>();
* When a new Host is learnt by the hosttracker module, it places the
* directly connected Node in Tier-1 & using this function, updates the Tier
* value for all other Nodes in the network hierarchy.
- *
+ *
* This is a recursive function and it takes care of updating the Tier value
* for all the connected and eligible Nodes.
- *
+ *
* @param n
* Node that represents one of the Vertex in the Topology Graph.
* @param currentTier
* Internal convenience routine to check the eligibility of a Switch for a
* Tier update. Any Node with Tier=0 or a Tier value that is greater than
* the new Tier Value is eligible for the update.
- *
+ *
* @param n
* Node for which the Tier update eligibility is checked
* @param tier
* that returns the Network Hierarchy for a given Host. This API is
* typically used by applications like Hadoop for Rack Awareness
* functionality.
- *
+ *
* @param hostAddress
* IP-Address of the host/node.
* @return Network Hierarchies represented by an Array of Array (of
* is used as the network for Hadoop Demos & in order to give a meaningful
* rack-awareness switch names, the DPID is organized in ASCII Characters
* and retrieved as string.
- *
+ *
* @param dpid
* Switch DataPath Id
* @return Ascii String represented by the DPID.
/**
* A convenient recursive routine to obtain the Hierarchy of Switches.
- *
+ *
* @param node
* Current Node in the Recursive routine.
* @param currHierarchy
/**
* Inform the controller IP to MAC binding of a host and its connectivity to
* an openflow switch in terms of Node, port, and VLAN.
- *
+ *
* @param networkAddr
* IP address of the host
* @param dataLayer
* Port of the switch to which host is connected
* @param vlan
* Vlan of which this host is member of
- *
+ *
* @return Status The status object as described in {@code Status}
* indicating the result of this action.
*/
/**
* Update the controller IP to MAC binding of a host and its connectivity to
* an openflow switch in terms of switch id, switch port, and VLAN.
- *
+ *
* @param networkAddr
* IP address of the host
* @param dataLayer
* Port of the switch to which host is connected
* @param vlan
* Vlan of which this host is member of
- *
+ *
* @return boolean true if the host was added successfully, false otherwise
*/
public boolean updateHostReq(InetAddress networkAddr,
/**
* Remove from the controller IP to MAC binding of a host and its
* connectivity to an openflow switch
- *
+ *
* @param networkAddr
* IP address of the host
- *
+ *
* @return boolean true if the host was removed successfully, false
* otherwise
*/
switch (type) {
case REMOVED:
- long sid = (Long) node.getID();
- if (logger.isDebugEnabled()) {
- logger.debug("Received removedSwitch for sw id {}",
- HexEncode.longToHexString(sid));
- }
+ logger.debug("Received removed node {}", node);
for (Entry<InetAddress, HostNodeConnector> entry : hostsDB
.entrySet()) {
HostNodeConnector host = entry.getValue();
- if (host.getnodeconnectornodeId() == sid) {
- logger.debug("Switch: {} is down, remove from Hosts_DB",
- sid);
+ if (host.getnodeconnectorNode().equals(node)) {
+ logger.debug("Node: {} is down, remove from Hosts_DB", node);
removeKnownHost(entry.getKey());
notifyHostLearnedOrRemoved(host, false);
}
}
private void handleNodeConnectorStatusDown(NodeConnector nodeConnector) {
- long sid = (Long) nodeConnector.getNode().getID();
- short port = (Short) nodeConnector.getID();
-
logger.debug("handleNodeConnectorStatusDown {}", nodeConnector);
for (Entry<InetAddress, HostNodeConnector> entry : hostsDB.entrySet()) {
HostNodeConnector host = entry.getValue();
- if ((host.getnodeconnectornodeId() == sid)
- && (host.getnodeconnectorportId() == port)) {
- logger.debug(
- "Switch: {}, Port: {} is down, remove from Hosts_DB",
- sid, port);
+ if (host.getnodeConnector().equals(nodeConnector)) {
+ logger.debug(" NodeConnector: {} is down, remove from Hosts_DB", nodeConnector);
removeKnownHost(entry.getKey());
notifyHostLearnedOrRemoved(host, false);
}
/**
* Function called by the dependency manager when all the required
* dependencies are satisfied
- *
+ *
*/
void init(Component c) {
Dictionary<?, ?> props = c.getServiceProperties();
* Function called by the dependency manager when at least one dependency
* become unsatisfied or when the component is shutting down because for
* example bundle is being stopped.
- *
+ *
*/
void destroy() {
destroyCache();
/**
* Function called by dependency manager after "init ()" is called and after
* the services provided by the class are registered in the service registry
- *
+ *
*/
void start() {
}
* Function called by the dependency manager before the services exported by
* the component are unregistered, this will be followed by a "destroy ()"
* calls
- *
+ *
*/
void stop() {
}
import org.osgi.framework.ServiceReference;
import org.osgi.framework.Bundle;
import javax.inject.Inject;
+
import org.junit.Assert;
import org.junit.Test;
import org.junit.Before;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
+import java.io.OutputStreamWriter;
import java.net.HttpURLConnection;
-import java.net.MalformedURLException;
import java.net.URL;
-import java.net.URLConnection;
import java.nio.charset.Charset;
import java.util.Arrays;
import org.opendaylight.controller.switchmanager.IInventoryListener;
import org.opendaylight.controller.usermanager.IUserManager;
+
@RunWith(PaxExam.class)
public class NorthboundIntegrationTest {
private Logger log = LoggerFactory
r = bc.getServiceReference(IfIptoHost.class.getName());
if (r != null) {
- this.invtoryListener = (IInventoryListener)bc.getService(r);
+ this.invtoryListener = (IInventoryListener) bc.getService(r);
}
// If inventoryListener is null, cannot run hosttracker tests.
assertNotNull(this.invtoryListener);
-
+
}
// static variable to pass response code from getJsonResult()
private static Integer httpResponseCode = null;
private String getJsonResult(String restUrl) {
- return getJsonResult(restUrl, "GET");
+ return getJsonResult(restUrl, "GET", null);
}
private String getJsonResult(String restUrl, String method) {
+ return getJsonResult(restUrl, method, null);
+ }
+
+ private String getJsonResult(String restUrl, String method, String body) {
// initialize response code to indicate error
httpResponseCode = 400;
try {
URL url = new URL(restUrl);
-
this.users.getAuthorizationList();
this.users.authenticate("admin", "admin");
String authString = "admin:admin";
connection.setRequestProperty("Content-Type", "application/json");
connection.setRequestProperty("Accept", "application/json");
+ if (body != null) {
+ connection.setDoOutput(true);
+ OutputStreamWriter wr = new OutputStreamWriter(
+ connection.getOutputStream());
+ wr.write(body);
+ wr.flush();
+ }
connection.connect();
connection.getContentType();
// Response code for success should be 2xx
httpResponseCode = connection.getResponseCode();
+ if (httpResponseCode > 299)
+ return httpResponseCode.toString();
InputStream is = connection.getInputStream();
BufferedReader rd = new BufferedReader(new InputStreamReader(is,
} catch (Exception e) {
return null;
}
-
}
@Test
String result = getJsonResult(baseURL + "flowstats");
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
- JSONObject flowStatistics =
- getJsonInstance (json, "flowStatistics", 0xCAFE);
+ JSONObject flowStatistics = getJsonInstance(json, "flowStatistics",
+ 0xCAFE);
JSONObject node = flowStatistics.getJSONObject("node");
// test that node was returned properly
Assert.assertTrue(node.getInt("@id") == 0xCAFE);
result = getJsonResult(baseURL + "portstats");
jt = new JSONTokener(result);
json = new JSONObject(jt);
- JSONObject portStatistics =
- getJsonInstance (json, "portStatistics", 0xCAFE);
+ JSONObject portStatistics = getJsonInstance(json, "portStatistics",
+ 0xCAFE);
JSONObject node2 = portStatistics.getJSONObject("node");
// test that node was returned properly
Assert.assertTrue(node2.getInt("@id") == 0xCAFE);
}
}
+ @Test
+ public void testFlowProgrammer() {
+ try {
+ String baseURL = "http://127.0.0.1:8080/controller/nb/v2/flow/default/";
+ // Attempt to get a flow that doesn't exit. Should return 404
+ // status.
+ String result = getJsonResult(baseURL + "STUB/51966/test1", "GET");
+ Assert.assertTrue(result.equals("404"));
+
+ // test add flow1
+ String fc = "{\"dynamic\":\"false\", \"name\":\"test1\", \"node\":{\"@id\":\"51966\",\"@type\":\"STUB\"}, \"actions\":[\"DROP\"]}";
+ result = getJsonResult(baseURL + "STUB/51966/test1", "POST", fc);
+ Assert.assertTrue(httpResponseCode == 201);
+
+ // test get returns flow that was added.
+ result = getJsonResult(baseURL + "STUB/51966/test1", "GET");
+ // check that result came out fine.
+ Assert.assertTrue(httpResponseCode == 200);
+ JSONTokener jt = new JSONTokener(result);
+ JSONObject json = new JSONObject(jt);
+ Assert.assertTrue(json.getString("name").equals("test1"));
+ Assert.assertTrue(json.getString("actions").equals("DROP"));
+ Assert.assertTrue(json.getString("installInHw").equals("true"));
+ JSONObject node = json.getJSONObject("node");
+ Assert.assertTrue(node.getString("@type").equals("STUB"));
+ Assert.assertTrue(node.getString("@id").equals("51966"));
+ // test adding same flow again fails due to repeat name..return 409
+ // code
+ result = getJsonResult(baseURL + "STUB/51966/test1", "POST", fc);
+ Assert.assertTrue(result.equals("409"));
+
+ fc = "{\"dynamic\":\"false\", \"name\":\"test2\", \"node\":{\"@id\":\"51966\",\"@type\":\"STUB\"}, \"actions\":[\"DROP\"]}";
+ result = getJsonResult(baseURL + "STUB/51966/test2", "POST", fc);
+ // test should return 500 for error due to same flow being added.
+ Assert.assertTrue(result.equals("500"));
+
+ // add second flow that's different
+ fc = "{\"dynamic\":\"false\", \"name\":\"test2\", \"nwSrc\":\"1.1.1.1\", \"node\":{\"@id\":\"51966\",\"@type\":\"STUB\"}, \"actions\":[\"DROP\"]}";
+ result = getJsonResult(baseURL + "STUB/51966/test2", "POST", fc);
+ Assert.assertTrue(httpResponseCode == 201);
+
+ // check that request returns both flows given node.
+ result = getJsonResult(baseURL + "STUB/51966/", "GET");
+ jt = new JSONTokener(result);
+ json = new JSONObject(jt);
+ Assert.assertTrue(json.get("flowConfig") instanceof JSONArray);
+ JSONArray ja = json.getJSONArray("flowConfig");
+ Integer count = ja.length();
+ Assert.assertTrue(count == 2);
+
+ // check that request returns both flows given just container.
+ result = getJsonResult(baseURL);
+ jt = new JSONTokener(result);
+ json = new JSONObject(jt);
+ Assert.assertTrue(json.get("flowConfig") instanceof JSONArray);
+ ja = json.getJSONArray("flowConfig");
+ count = ja.length();
+ Assert.assertTrue(count == 2);
+
+ // delete a flow, check that it's no longer in list.
+ result = getJsonResult(baseURL + "STUB/51966/test2", "DELETE");
+ Assert.assertTrue(httpResponseCode == 200);
+
+ result = getJsonResult(baseURL + "STUB/51966/test2", "GET");
+ Assert.assertTrue(result.equals("404"));
+
+ } catch (Exception e) {
+ Assert.assertTrue(false);
+ }
+
+ }
+
// method to extract a JSONObject with specified node ID from a JSONObject
- // that may contain an array of JSONObjects
- // This is specifically written for statistics manager northbound REST interface
+ // that may contain an array of JSONObjects
+ // This is specifically written for statistics manager northbound REST
+ // interface
// array_name should be either "flowStatistics" or "portStatistics"
- private JSONObject getJsonInstance (JSONObject json, String array_name, Integer nodeId) throws JSONException
- {
+ private JSONObject getJsonInstance(JSONObject json, String array_name,
+ Integer nodeId) throws JSONException {
JSONObject result = null;
- if (json.get(array_name) instanceof JSONArray){
+ if (json.get(array_name) instanceof JSONArray) {
JSONArray json_array = json.getJSONArray(array_name);
for (int i = 0; i < json_array.length(); i++) {
result = json_array.getJSONObject(i);
Integer nid = result.getJSONObject("node").getInt("@id");
- if ( nid.equals(nodeId) ) break;
+ if (nid.equals(nodeId))
+ break;
}
- }
- else {
+ } else {
result = json.getJSONObject(array_name);
Integer nid = result.getJSONObject("node").getInt("@id");
- if ( ! nid.equals(nodeId) ) result = null;
+ if (!nid.equals(nodeId))
+ result = null;
}
return result;
}
-
// a class to construct query parameter for HTTP request
private class QueryParameter {
StringBuilder queryString = null;
-
+
// constructor
- QueryParameter (String key, String value) {
+ QueryParameter(String key, String value) {
queryString = new StringBuilder();
queryString.append("?").append(key).append("=").append(value);
}
-
+
// method to add more query parameter
- QueryParameter add (String key, String value){
+ QueryParameter add(String key, String value) {
this.queryString.append("&").append(key).append("=").append(value);
return this;
}
-
+
// method to get the query parameter string
- String getString (){
+ String getString() {
return this.queryString.toString();
}
}
-
-
+
@Test
public void testHostTracker() {
String nodeConnectorType_1 = "STUB";
Integer nodeConnectorId_1 = 12;
String vlan_1 = "4";
-
-
+
// 2nd host
String networkAddress_2 = "10.1.1.1";
String dataLayerAddress_2 = "1A:2B:3C:4D:5E:6F";
String nodeConnectorType_2 = "STUB";
Integer nodeConnectorId_2 = 34;
String vlan_2 = "0";
-
+
String baseURL = "http://127.0.0.1:8080/controller/nb/v2/host/default";
// test POST method: addHost()
try {
- String queryParameter =
- new QueryParameter("dataLayerAddress", dataLayerAddress_1)
- .add("nodeType", nodeType_1)
+ String queryParameter = new QueryParameter("dataLayerAddress",
+ dataLayerAddress_1).add("nodeType", nodeType_1)
.add("nodeId", nodeId_1.toString())
.add("nodeConnectorType", nodeConnectorType_1)
.add("nodeConnectorId", nodeConnectorId_1.toString())
- .add("vlan", vlan_1)
- .getString();
+ .add("vlan", vlan_1).getString();
- String result = getJsonResult(baseURL +"/" + networkAddress_1 + queryParameter, "POST");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 201);
-
- // vlan is not passed through query parameter but should be defaulted to "0"
- queryParameter =
- new QueryParameter("dataLayerAddress", dataLayerAddress_2)
- .add("nodeType", nodeType_2)
+ String result = getJsonResult(baseURL + "/" + networkAddress_1
+ + queryParameter, "POST");
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 201);
+
+ // vlan is not passed through query parameter but should be
+ // defaulted to "0"
+ queryParameter = new QueryParameter("dataLayerAddress",
+ dataLayerAddress_2).add("nodeType", nodeType_2)
.add("nodeId", nodeId_2.toString())
.add("nodeConnectorType", nodeConnectorType_2)
.add("nodeConnectorId", nodeConnectorId_2.toString())
.getString();
- result = getJsonResult(baseURL +"/" + networkAddress_2 + queryParameter, "POST");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 201);
+ result = getJsonResult(baseURL + "/" + networkAddress_2
+ + queryParameter, "POST");
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 201);
} catch (Exception e) {
// Got an unexpected exception
Assert.assertTrue(false);
}
-
+
// define variables for decoding returned strings
String networkAddress;
JSONObject host_jo, dl_jo, nc_jo, node_jo;
-
+
// the two hosts should be in inactive host DB
// test GET method: getInactiveHosts()
try {
- String result = getJsonResult(baseURL +"/inactive", "GET");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ String result = getJsonResult(baseURL + "/inactive", "GET");
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
// there should be at least two hosts in the DB
- Assert.assertTrue (json.get("host") instanceof JSONArray);
+ Assert.assertTrue(json.get("host") instanceof JSONArray);
JSONArray ja = json.getJSONArray("host");
Integer count = ja.length();
- Assert.assertTrue (count == 2);
-
- for ( int i = 0; i < count; i++) {
+ Assert.assertTrue(count == 2);
+
+ for (int i = 0; i < count; i++) {
host_jo = ja.getJSONObject(i);
dl_jo = host_jo.getJSONObject("dataLayerAddress");
nc_jo = host_jo.getJSONObject("nodeConnector");
node_jo = nc_jo.getJSONObject("node");
-
+
networkAddress = host_jo.getString("networkAddress");
if (networkAddress.equalsIgnoreCase(networkAddress_1)) {
- Assert.assertTrue (dl_jo.getString("macAddress").equalsIgnoreCase(dataLayerAddress_1));
- Assert.assertTrue (nc_jo.getString("@type").equalsIgnoreCase(nodeConnectorType_1));
- Assert.assertTrue (Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_1);
- Assert.assertTrue (node_jo.getString("@type").equalsIgnoreCase(nodeType_1));
- Assert.assertTrue (Integer.parseInt(node_jo.getString("@id")) == nodeId_1);
- Assert.assertTrue (host_jo.getString("vlan").equalsIgnoreCase(vlan_1));
- }
- else if (networkAddress.equalsIgnoreCase(networkAddress_2)) {
- Assert.assertTrue (dl_jo.getString("macAddress").equalsIgnoreCase(dataLayerAddress_2));
- Assert.assertTrue (nc_jo.getString("@type").equalsIgnoreCase(nodeConnectorType_2));
- Assert.assertTrue (Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_2);
- Assert.assertTrue (node_jo.getString("@type").equalsIgnoreCase(nodeType_2));
- Assert.assertTrue (Integer.parseInt(node_jo.getString("@id")) == nodeId_2);
- Assert.assertTrue (host_jo.getString("vlan").equalsIgnoreCase(vlan_2));
- }
- else {
+ Assert.assertTrue(dl_jo.getString("macAddress")
+ .equalsIgnoreCase(dataLayerAddress_1));
+ Assert.assertTrue(nc_jo.getString("@type")
+ .equalsIgnoreCase(nodeConnectorType_1));
+ Assert.assertTrue(Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_1);
+ Assert.assertTrue(node_jo.getString("@type")
+ .equalsIgnoreCase(nodeType_1));
+ Assert.assertTrue(Integer.parseInt(node_jo.getString("@id")) == nodeId_1);
+ Assert.assertTrue(host_jo.getString("vlan")
+ .equalsIgnoreCase(vlan_1));
+ } else if (networkAddress.equalsIgnoreCase(networkAddress_2)) {
+ Assert.assertTrue(dl_jo.getString("macAddress")
+ .equalsIgnoreCase(dataLayerAddress_2));
+ Assert.assertTrue(nc_jo.getString("@type")
+ .equalsIgnoreCase(nodeConnectorType_2));
+ Assert.assertTrue(Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_2);
+ Assert.assertTrue(node_jo.getString("@type")
+ .equalsIgnoreCase(nodeType_2));
+ Assert.assertTrue(Integer.parseInt(node_jo.getString("@id")) == nodeId_2);
+ Assert.assertTrue(host_jo.getString("vlan")
+ .equalsIgnoreCase(vlan_2));
+ } else {
Assert.assertTrue(false);
}
}
// Got an unexpected exception
Assert.assertTrue(false);
}
-
+
// test GET method: getActiveHosts() - no host expected
try {
String result = getJsonResult(baseURL, "GET");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
Assert.assertFalse(hostInJson(json, networkAddress_1));
// Got an unexpected exception
Assert.assertTrue(false);
}
-
+
// put the 1st host into active host DB
Node nd;
NodeConnector ndc;
try {
nd = new Node(nodeType_1, nodeId_1);
ndc = new NodeConnector(nodeConnectorType_1, nodeConnectorId_1, nd);
- this.invtoryListener.notifyNodeConnector(ndc,
- UpdateType.ADDED, null);
- }catch(ConstructionException e){
+ this.invtoryListener.notifyNodeConnector(ndc, UpdateType.ADDED,
+ null);
+ } catch (ConstructionException e) {
ndc = null;
nd = null;
}
-
+
// verify the host shows up in active host DB
try {
String result = getJsonResult(baseURL, "GET");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
-
+
Assert.assertTrue(hostInJson(json, networkAddress_1));
} catch (Exception e) {
// Got an unexpected exception
Assert.assertTrue(false);
}
-
-
+
// test GET method for getHostDetails()
try {
- String result = getJsonResult(baseURL+"/"+networkAddress_1, "GET");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ String result = getJsonResult(baseURL + "/" + networkAddress_1,
+ "GET");
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
Assert.assertFalse(json.length() == 0);
-
+
dl_jo = json.getJSONObject("dataLayerAddress");
nc_jo = json.getJSONObject("nodeConnector");
node_jo = nc_jo.getJSONObject("node");
-
- Assert.assertTrue (json.getString("networkAddress").equalsIgnoreCase(networkAddress_1));
- Assert.assertTrue (dl_jo.getString("macAddress").equalsIgnoreCase(dataLayerAddress_1));
- Assert.assertTrue (nc_jo.getString("@type").equalsIgnoreCase(nodeConnectorType_1));
- Assert.assertTrue (Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_1);
- Assert.assertTrue (node_jo.getString("@type").equalsIgnoreCase(nodeType_1));
- Assert.assertTrue (Integer.parseInt(node_jo.getString("@id")) == nodeId_1);
- Assert.assertTrue (json.getString("vlan").equalsIgnoreCase(vlan_1));
+
+ Assert.assertTrue(json.getString("networkAddress")
+ .equalsIgnoreCase(networkAddress_1));
+ Assert.assertTrue(dl_jo.getString("macAddress").equalsIgnoreCase(
+ dataLayerAddress_1));
+ Assert.assertTrue(nc_jo.getString("@type").equalsIgnoreCase(
+ nodeConnectorType_1));
+ Assert.assertTrue(Integer.parseInt(nc_jo.getString("@id")) == nodeConnectorId_1);
+ Assert.assertTrue(node_jo.getString("@type").equalsIgnoreCase(
+ nodeType_1));
+ Assert.assertTrue(Integer.parseInt(node_jo.getString("@id")) == nodeId_1);
+ Assert.assertTrue(json.getString("vlan").equalsIgnoreCase(vlan_1));
} catch (Exception e) {
// Got an unexpected exception
Assert.assertTrue(false);
}
-
+
// test DELETE method for deleteFlow()
try {
- String result = getJsonResult(baseURL+"/"+networkAddress_1, "DELETE");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ String result = getJsonResult(baseURL + "/" + networkAddress_1,
+ "DELETE");
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
} catch (Exception e) {
// Got an unexpected exception
Assert.assertTrue(false);
}
-
+
// verify host_1 removed from active host DB
// test GET method: getActiveHosts() - no host expected
try {
String result = getJsonResult(baseURL, "GET");
- Assert.assertTrue (httpResponseCode.intValue() == (Integer) 200);
-
+ Assert.assertTrue(httpResponseCode.intValue() == (Integer) 200);
+
JSONTokener jt = new JSONTokener(result);
JSONObject json = new JSONObject(jt);
-
+
Assert.assertFalse(hostInJson(json, networkAddress_1));
} catch (Exception e) {
// Got an unexpected exception
Assert.assertTrue(false);
}
- }
-
- private Boolean hostInJson (JSONObject json, String hostIp) throws JSONException {
- // input JSONObject may be empty
- if ( json.length() == 0 ) {
+ }
+
+ private Boolean hostInJson(JSONObject json, String hostIp)
+ throws JSONException {
+ // input JSONObject may be empty
+ if (json.length() == 0) {
return false;
}
- if (json.get("host") instanceof JSONArray){
+ if (json.get("host") instanceof JSONArray) {
JSONArray ja = json.getJSONArray("host");
for (int i = 0; i < ja.length(); i++) {
String na = ja.getJSONObject(i).getString("networkAddress");
if (na.equalsIgnoreCase(hostIp))
return true;
- }
+ }
return false;
- }
- else {
+ } else {
String na = json.getJSONObject("host").getString("networkAddress");
return (na.equalsIgnoreCase(hostIp)) ? true : false;
}
}
-
// Configure the OSGi container
@Configuration
public Option[] config() {
} else if (typeStr.equals(NodeIDType.PRODUCTION)) {
this.nodeID = IDStr;
} else {
- // We need to lookup via OSGi service registry for an
- // handler for this
+ //Use plugin's method to get appropriate conversion from IDStr to nodeID
+ INodeFactory f = (INodeFactory) ServiceHelper
+ .getGlobalInstance(INodeFactory.class, new Node(), "(protocolName="+typeStr+")");
+ if(f!=null){
+ Node n = f.fromString(typeStr, IDStr);
+ this.nodeID = n.nodeID;
+ }
}
}
import java.util.LinkedHashMap;
import java.util.Map;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
import org.apache.commons.lang3.tuple.ImmutablePair;
import org.apache.commons.lang3.tuple.Pair;
@Override
public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result
+ + ((fieldValues == null) ? 0 : fieldValues.hashCode());
+ return result;
}
@Override
public boolean equals(Object obj) {
- return EqualsBuilder.reflectionEquals(this, obj);
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ ARP other = (ARP) obj;
+ if (fieldValues == null) {
+ if (other.fieldValues != null)
+ return false;
+ } else if (!fieldValues.equals(other.fieldValues))
+ return false;
+ return true;
}
}
* Deriving the Total Length here
*/
int payloadLength = 0;
- try {
- payloadLength = payload.serialize().length;
- } catch (PacketException e) {
- logger.error("", e);
+ if (payload != null) {
+ try {
+ payloadLength = payload.serialize().length;
+ } catch (PacketException e) {
+ logger.error("", e);
+ }
}
this.setTotalLength((short) (this.getHeaderLen() + payloadLength));
import java.io.UnsupportedEncodingException;
import java.nio.charset.Charset;
-import java.util.HashMap;
-
import java.util.Arrays;
+import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
-import org.apache.commons.lang3.builder.EqualsBuilder;
-import org.apache.commons.lang3.builder.HashCodeBuilder;
+
import org.apache.commons.lang3.tuple.MutablePair;
import org.apache.commons.lang3.tuple.Pair;
import org.opendaylight.controller.sal.utils.HexEncode;
@Override
public int hashCode() {
- return HashCodeBuilder.reflectionHashCode(this);
+ final int prime = 31;
+ int result = super.hashCode();
+ result = prime * result
+ + ((fieldValues == null) ? 0 : fieldValues.hashCode());
+ return result;
}
@Override
public boolean equals(Object obj) {
- return EqualsBuilder.reflectionEquals(this, obj);
+ if (this == obj)
+ return true;
+ if (!super.equals(obj))
+ return false;
+ if (getClass() != obj.getClass())
+ return false;
+ LLDPTLV other = (LLDPTLV) obj;
+ if (fieldValues == null) {
+ if (other.fieldValues != null)
+ return false;
+ } else if (!fieldValues.equals(other.fieldValues))
+ return false;
+ return true;
}
@Override
/**
* Returns the size in bits of the whole TLV
- *
+ *
* @return int - size in bits of full TLV
*/
public int getTLVSize() {
/**
* Creates the ChassisID TLV value including the subtype and ChassisID
* string
- *
+ *
* @param nodeId
* node identifier string
* @return the ChassisID TLV value in byte array
/**
* Creates the PortID TLV value including the subtype and PortID string
- *
+ *
* @param portId
* port identifier string
* @return the PortID TLV value in byte array
/**
* Creates the custom TLV value including OUI, subtype and custom string
- *
+ *
* @param portId
* port identifier string
* @return the custom TLV value in byte array
/**
* Retrieves the string from TLV value and returns it in HexString format
- *
+ *
* @param tlvValue
* the TLV value
* @param tlvLen
/**
* Retrieves the string from TLV value
- *
+ *
* @param tlvValue
* the TLV value
* @param tlvLen
/**
* Retrieves the custom string from the Custom TLV value which includes OUI,
* subtype and custom string
- *
+ *
* @param customTlvValue
* the custom TLV value
* @param customTlvLen
/**
* This method deserializes the data bits obtained from the wire into the
* respective header and payload which are of type Packet
- *
+ *
* @param byte[] data - data from wire to deserialize
* @param int bitOffset bit position where packet header starts in data
* array
/**
* This method serializes the header and payload from the respective
* packet class, into a single stream of bytes to be sent on the wire
- *
+ *
* @return The byte array representing the serialized Packet
* @throws PacketException
*/
* byte stream which cannot be done or cannot be done efficiently during the
* normal Packet.serialize() path. An example is the checksum computation
* for IPv4
- *
+ *
* @param byte[] - serialized bytes
* @throws PacketException
*/
* of checksum varies based on the protocol, this method is overridden.
* Currently only IPv4 and ICMP do checksum computation and validation. TCP
* and UDP need to implement these if required.
- *
+ *
* @param byte[] data The byte stream representing the Ethernet frame
* @param int startBitOffset The bit offset from where the byte array corresponding to this Packet starts in the frame
* @throws PacketException
/**
* Gets the header length in bits
- *
+ *
* @return int the header length in bits
*/
public int getHeaderSize() {
* This method fetches the start bit offset for header field specified by
* 'fieldname'. The offset is present in the hdrFieldCoordMap of the
* respective packet class
- *
+ *
* @param String
* fieldName
* @return Integer - startOffset of the requested field
* This method fetches the number of bits for header field specified by
* 'fieldname'. The numBits are present in the hdrFieldCoordMap of the
* respective packet class
- *
+ *
* @param String
* fieldName
* @return Integer - number of bits of the requested field
/**
* Returns the raw payload carried by this packet in case payload was not
* parsed. Caller can call this function in case the getPaylod() returns null.
- *
+ *
* @return The raw payload if not parsable as an array of bytes, null otherwise
*/
public byte[] getRawPayload() {
/**
* Set a raw payload in the packet class
- *
+ *
* @param payload The raw payload as byte array
*/
public void setRawPayload(byte[] payload) {
* packet received from wire is not equal to the checksum read from the
* stream. For the Packet class which do not have a checksum field, this
* function will always return false.
- *
- *
+ *
+ *
* @return true if the deserialized packet's recomputed checksum is not
* equal to the packet carried checksum
*/
.getGlobalInstance(IUserManager.class, this);
if (userManager != null) {
return userManager.getPassword(username);
- } else
+ } else {
throw new RuntimeException("User Manager reference is null");
+ }
}
@Override
IUserManager userManager = (IUserManager) ServiceHelper
.getGlobalInstance(IUserManager.class, this);
if (userManager != null) {
- final List<String> levels = new ArrayList<String>();
- UserLevel level = userManager.getUserLevel(username);
- if (level == null) level = UserLevel.NOUSER;
- levels.add(level.toString());
- return new GenericPrincipal(username, "", levels);
- } else
+ List<String> controllerRoles = new ArrayList<String>();
+ for (UserLevel level : userManager.getUserLevels(username)) {
+ controllerRoles.add(level.toString());
+ }
+ return new GenericPrincipal(username, "", controllerRoles);
+ } else {
throw new RuntimeException("User Manager reference is null");
-
+ }
}
@Override
logger.error("Authentication failed for user " + username);
return null;
}
- } else
+ } else {
throw new RuntimeException("User Manager reference is null");
+ }
}
}
@Override
public byte[] getNodeMAC(Node node) {
- MacAddress mac = (MacAddress) nodeProps.get(MacAddress.name);
+ MacAddress mac = (MacAddress) this.getNodeProp(node,
+ MacAddress.name);
return (mac != null) ? mac.getMacAddress() : null;
}
/**
* Returns the list of roles associated to the passed user name
- *
+ *
* @param userName
* @return the role associated to the user name
*/
/**
* Authenticate user with AAA server and return authentication and
* authorization info
- *
+ *
* @param username
* the username
* @param password
/**
* Add/remove AAA server
- *
+ *
* @param configObject
* {@link org.opendaylight.controller.usermanager.internal.ServerConfig}
* Server Configuration
/**
* Remove AAA server
- *
+ *
* @param configObject
* refer to
* {@link org.opendaylight.controller.usermanager.internal.ServerConfig}
/**
* Add a local user
- *
+ *
* @param configObject
* {@link org.opendaylight.controller.usermanager.internal.UserConfig}
* User Configuration
/**
* Remove a local user
- *
+ *
* @param configObject
* {@link org.opendaylight.controller.usermanager.internal.UserConfig}
* UserConfig
/**
* Remove a local user
- *
+ *
* @param userName
* the user name
* @return {@link org.opendaylight.controller.sal.utils.Status}
/**
* Add the authorization information for a user that gets authenticated
* remotely
- *
+ *
* @param AAAconf
* {@link org.opendaylight.controller.usermanager.internal.AuthorizationConfig}
* Authorization Resources
/**
* Remove the authorization information for a user that gets authenticated
* remotely
- *
+ *
* @param AAAconf
* {@link org.opendaylight.controller.usermanager.internal.AuthorizationConfig}
* Authorization Resource
/**
* Return the list of authorization resources
- *
+ *
* @return {@link org.opendaylight.controller.usermanager.internal.AuthorizationConfig}
* List of Authorization Resource
*/
/**
* Returns a list of AAA Providers.
- *
+ *
* @return Set of provider names.
*/
public Set<String> getAAAProviderNames();
/**
* Change the current password for a locally configured user
- *
+ *
* @param user
* the username
* @param curPasssword
/**
* Return a list of AAA servers currently configured
- *
+ *
* @return {@link org.opendaylight.controller.usermanager.internal.ServerConfig}
* List of ServerConfig
*/
/**
* Return a list of local users
- *
+ *
* @return {@link org.opendaylight.controller.usermanager.internal.UserConfig}
* List of UserConfig
*/
/**
* Save the local users to disk
- *
+ *
* @return {@link org.opendaylight.controller.sal.utils.Status}
* status of this action
*/
/**
* Save the AAA server configurations to disk
- *
+ *
* @return {@link org.opendaylight.controller.sal.utils.Status}
* status of this action
*/
/**
* Save the Authorization configurations to disk
- *
+ *
* @return {@link org.opendaylight.controller.sal.utils.Status}
* status code
*/
/**
* Remove user profile when user logs out
- *
+ *
* @param username
* the user name
*/
/**
* Remove user profile when user times out
- *
+ *
* @param username
* the user name
*/
/**
* Get the list of users currently logged in
- *
+ *
* @return the list of users along with their administrative roles
*/
public Map<String, List<String>> getUserLoggedIn();
/**
* Get date and time user was successfully authenticated
- *
+ *
* @param user
* @return Date in String format
*/
public String getAccessDate(String user);
/**
- * Returns the user level for the passed user name. It checks the roles
+ * Returns the highest user level for the passed user name. It checks the roles
* assigned to this user and checks against the well known Controller user
* roles to determines the highest user level associated with the user
- *
+ *
* @param userName
* the user name
* @return {@link org.opendaylight.controller.sal.authorization.UserLevel}
*/
public UserLevel getUserLevel(String userName);
+ /**
+ * Returns the list of user level for the passed user name. It checks the roles
+ * assigned to this user and checks against the well known Controller user
+ * roles to determines the corresponding list of user level associated with the user
+ *
+ * @param userName
+ * the user name
+ * @return
+ * the list of user level for this user
+ */
+ public List<UserLevel> getUserLevels(String userName);
+
/**
* Returns the Security Context
- *
+ *
* @returns {@link org.springframework.security.web.context.SecurityContextRepository}
* Security Context
*/
/**
* Returns the Session Manager Interface Handler
- *
+ *
* @return {@link org.opendaylight.controller.usermanager.ISessionManager}
* session manager interface handler
*/
/* non-Javadoc
* Returns the password for a given user
- *
+ *
* @param username
* the user name
* @return password for the username
private ConcurrentMap<String, UserConfig> localUserConfigList;
private ConcurrentMap<String, ServerConfig> remoteServerConfigList;
// local authorization info for remotely authenticated users
- private ConcurrentMap<String, AuthorizationConfig> authorizationConfList;
+ private ConcurrentMap<String, AuthorizationConfig> authorizationConfList;
private ConcurrentMap<String, AuthenticatedUser> activeUsers;
private ConcurrentMap<String, IAAAProvider> authProviders;
private ConcurrentMap<Long, String> localUserListSaveConfigEvent,
- remoteServerSaveConfigEvent, authorizationSaveConfigEvent;
+ remoteServerSaveConfigEvent, authorizationSaveConfigEvent;
private IClusterGlobalServices clusterGlobalService = null;
private SecurityContextRepository securityContextRepo = new UserSecurityContextRepository();
private IContainerAuthorization containerAuthorizationClient;
return authProviders.get(name);
}
+ @Override
public Set<String> getAAAProviderNames() {
return authProviders.keySet();
}
} else if (rcResponse.getStatus() == AuthResultEnum.AUTH_REJECT) {
logger.info(
"Remote Authentication Rejected User: \"{}\", from Server: {}, Reason:{}",
- new Object[] {userName, aaaServer.getAddress(),
- rcResponse.getStatus().toString()});
+ new Object[] { userName, aaaServer.getAddress(),
+ rcResponse.getStatus().toString() });
} else {
logger.info(
"Remote Authentication Failed for User: \"{}\", from Server: {}, Reason:{}",
- new Object[] {userName, aaaServer.getAddress(),
- rcResponse.getStatus().toString()});
+ new Object[] { userName, aaaServer.getAddress(),
+ rcResponse.getStatus().toString() });
}
}
}
putUserInActiveList(userName, result);
if (authorized) {
logger.info("User \"{}\" authorized for the following role(s): {}",
- userName, result.getUserRoles());
+ userName, result.getUserRoles());
} else {
logger.info("User \"{}\" Not Authorized for any role ", userName);
}
activeUsers.remove(user);
}
+ @Override
public Status saveLocalUserList() {
// Publish the save config event to the cluster nodes
localUserListSaveConfigEvent.put(new Date().getTime(), SAVE);
localUserConfigList), usersFileName);
}
+ @Override
public Status saveAAAServerList() {
// Publish the save config event to the cluster nodes
remoteServerSaveConfigEvent.put(new Date().getTime(), SAVE);
remoteServerConfigList), serversFileName);
}
+ @Override
public Status saveAuthorizationList() {
// Publish the save config event to the cluster nodes
authorizationSaveConfigEvent.put(new Date().getTime(), SAVE);
return status;
}
// Trigger cluster update
- localUserConfigList.put(user, targetConfigEntry);
+ localUserConfigList.put(user, targetConfigEntry);
logger.info("Password changed for User \"{}\"", user);
String userName = ci.nextArgument();
String password = ci.nextArgument();
String role = ci.nextArgument();
-
+
List<String> roles = new ArrayList<String>();
while (role != null) {
if (!role.trim().isEmpty()) {
if (target == null) {
ci.println("User not found");
return;
- }
+ }
ci.println(this.removeLocalUser(target));
}
/**
* Function called by the dependency manager when all the required
* dependencies are satisfied
- *
+ *
*/
void init() {
}
* Function called by the dependency manager when at least one dependency
* become unsatisfied or when the component is shutting down because for
* example bundle is being stopped.
- *
+ *
*/
void destroy() {
}
/**
* Function called by dependency manager after "init ()" is called and after
* the services provided by the class are registered in the service registry
- *
+ *
*/
void start() {
authProviders = new ConcurrentHashMap<String, IAAAProvider>();
* Function called by the dependency manager before the services exported by
* the component are unregistered, this will be followed by a "destroy ()"
* calls
- *
+ *
*/
void stop() {
}
return UserLevel.NOUSER;
}
+
+ @Override
+ public List<UserLevel> getUserLevels(String username) {
+ // Returns the controller well-know user levels for the passed user
+ List<String> rolesNames = null;
+ List<UserLevel> levels = new ArrayList<UserLevel>();
+
+ if (activeUsers.containsKey(username)) {
+ List<String> roles = activeUsers.get(username).getUserRoles();
+ rolesNames = (roles == null || roles.isEmpty()) ? null : roles;
+ } else if (localUserConfigList.containsKey(username)) {
+ UserConfig config = localUserConfigList.get(username);
+ rolesNames = (config == null) ? null : config.getRoles();
+ }
+
+ if (rolesNames == null) {
+ return levels;
+ }
+
+ // Check against the well known controller roles first
+ if (rolesNames.contains(UserLevel.SYSTEMADMIN.toString())) {
+ levels.add(UserLevel.SYSTEMADMIN);
+ }
+ if (rolesNames.contains(UserLevel.NETWORKADMIN.toString())) {
+ levels.add(UserLevel.NETWORKADMIN);
+ }
+ if (rolesNames.contains(UserLevel.NETWORKOPERATOR.toString())) {
+ levels.add(UserLevel.NETWORKOPERATOR);
+ }
+ // Check if container user now
+ if (containerAuthorizationClient != null) {
+ for (String roleName : rolesNames) {
+ if (containerAuthorizationClient.isApplicationRole(roleName)) {
+ levels.add(UserLevel.CONTAINERUSER);
+ break;
+ }
+ }
+ }
+ // Finally check if application user
+ if (applicationAuthorizationClients != null) {
+ for (String roleName : rolesNames) {
+ for (IResourceAuthorization client : this.applicationAuthorizationClients) {
+ if (client.isApplicationRole(roleName)) {
+ levels.add(UserLevel.APPUSER);
+ break;
+ }
+ }
+ }
+ }
+ return levels;
+ }
+
@Override
public Status saveConfiguration() {
boolean success = true;
.getPassword(), enabled, accountNonExpired,
credentialsNonExpired, accountNonLocked,
user.getGrantedAuthorities(getUserLevel(username)));
- } else
+ } else {
throw new UsernameNotFoundException("User not found " + username);
+ }
}
@Override
.getName())));
return authentication;
- } else
+ } else {
throw new BadCredentialsException(
"Username or credentials did not match");
+ }
}
this.sessionMgr = sessionMgr;
}
+ @Override
public String getPassword(String username) {
return localUserConfigList.get(username).getPassword();
}