From 181b536d898b6385093d4e4eddad495917da4571 Mon Sep 17 00:00:00 2001 From: Moiz Raja Date: Mon, 30 Sep 2013 14:25:14 -0700 Subject: [PATCH] Add first integration test for the TopologyManager bundle Change-Id: I9a5230f0f72ba51a88bb36141773b4d00885a774 Signed-off-by: Moiz Raja --- .../distribution/opendaylight/pom.xml | 1 + .../stub/internal/Activator.java | 45 ++-- .../stub/internal/TopologyServices.java | 48 +++++ .../controller/sal/action/Action.java | 12 +- .../topologymanager/integrationtest/pom.xml | 146 +++++++++++++ .../topologymanager/TopologyManagerIT.java | 204 ++++++++++++++++++ .../src/test/resources/logback.xml | 13 ++ .../usermanager/AuthenticatedUserTest.java | 9 +- 8 files changed, 450 insertions(+), 28 deletions(-) create mode 100644 opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/TopologyServices.java create mode 100644 opendaylight/topologymanager/integrationtest/pom.xml create mode 100644 opendaylight/topologymanager/integrationtest/src/test/java/org/opendaylight/controller/topologymanager/TopologyManagerIT.java create mode 100644 opendaylight/topologymanager/integrationtest/src/test/resources/logback.xml diff --git a/opendaylight/distribution/opendaylight/pom.xml b/opendaylight/distribution/opendaylight/pom.xml index 4345a3fd00..ccdb26845b 100644 --- a/opendaylight/distribution/opendaylight/pom.xml +++ b/opendaylight/distribution/opendaylight/pom.xml @@ -66,6 +66,7 @@ ../../statisticsmanager/implementation ../../statisticsmanager/integrationtest ../../topologymanager/implementation + ../../topologymanager/integrationtest ../../usermanager/api ../../usermanager/implementation ../../connectionmanager/api diff --git a/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/Activator.java b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/Activator.java index 79edd93c67..843e60ec36 100644 --- a/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/Activator.java +++ b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/Activator.java @@ -1,31 +1,35 @@ -package org.opendaylight.controller.protocol_plugins.stub.internal; +/* + * 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 + */ + -import java.util.Dictionary; -import java.util.Hashtable; -import org.apache.felix.dm.Component; +package org.opendaylight.controller.protocol_plugins.stub.internal; + +import org.apache.felix.dm.Component; import org.opendaylight.controller.sal.core.ComponentActivatorAbstractBase; -import org.opendaylight.controller.sal.core.IContainerListener; -import org.opendaylight.controller.sal.utils.INodeConnectorFactory; -import org.opendaylight.controller.sal.utils.INodeFactory; import org.opendaylight.controller.sal.core.Node; import org.opendaylight.controller.sal.core.NodeConnector; -import org.opendaylight.controller.sal.discovery.IDiscoveryService; import org.opendaylight.controller.sal.flowprogrammer.IPluginInFlowProgrammerService; import org.opendaylight.controller.sal.inventory.IPluginInInventoryService; 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.IReadService; import org.opendaylight.controller.sal.topology.IPluginInTopologyService; import org.opendaylight.controller.sal.topology.IPluginOutTopologyService; import org.opendaylight.controller.sal.utils.GlobalConstants; - +import org.opendaylight.controller.sal.utils.INodeConnectorFactory; +import org.opendaylight.controller.sal.utils.INodeFactory; import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import java.util.Dictionary; +import java.util.Hashtable; + /** * stub protocol plugin Activator * @@ -68,7 +72,7 @@ public class Activator extends ComponentActivatorAbstractBase { */ @Override public Object[] getImplementations() { - Object[] res = { ReadService.class, InventoryService.class }; + Object[] res = { ReadService.class, InventoryService.class, TopologyServices.class }; return res; } @@ -106,6 +110,17 @@ public class Activator extends ComponentActivatorAbstractBase { props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), "STUB"); c.setInterface(IPluginInInventoryService.class.getName(), props); } + + if(imp.equals(TopologyServices.class)){ + Dictionary props = new Hashtable(); + props.put(GlobalConstants.PROTOCOLPLUGINTYPE.toString(), "STUB"); + c.setInterface(IPluginInTopologyService.class.getName(), props); + c.add(createServiceDependency().setService(IPluginOutTopologyService.class, "") + .setCallbacks("setPluginOutTopologyService", "unsetPluginOutTopologyService") + .setRequired(true)); + + } + } @Override @@ -115,7 +130,8 @@ public class Activator extends ComponentActivatorAbstractBase { FlowProgrammerService.class, StubNodeFactory.class, StubNodeConnectorFactory.class, - InventoryService.class }; + InventoryService.class + }; return res; } @@ -159,5 +175,6 @@ public class Activator extends ComponentActivatorAbstractBase { .setCallbacks("setPluginOutInventoryServices", "unsetPluginOutInventoryServices") .setRequired(true)); } + } } diff --git a/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/TopologyServices.java b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/TopologyServices.java new file mode 100644 index 0000000000..104df0a94c --- /dev/null +++ b/opendaylight/protocol_plugins/stub/src/main/java/org/opendaylight/controller/protocol_plugins/stub/internal/TopologyServices.java @@ -0,0 +1,48 @@ +/* + * 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.protocol_plugins.stub.internal; + +import org.opendaylight.controller.sal.core.Edge; +import org.opendaylight.controller.sal.core.Property; +import org.opendaylight.controller.sal.core.UpdateType; +import org.opendaylight.controller.sal.topology.IPluginInTopologyService; +import org.opendaylight.controller.sal.topology.IPluginOutTopologyService; +import org.opendaylight.controller.sal.topology.TopoEdgeUpdate; + +import java.util.ArrayList; +import java.util.List; +import java.util.Set; + +public class TopologyServices implements IPluginInTopologyService { + private IPluginOutTopologyService pluginOutTopologyService; + + + @Override + public void sollicitRefresh() { + } + + public void setPluginOutTopologyService(IPluginOutTopologyService pluginOutTopologyService){ + this.pluginOutTopologyService = pluginOutTopologyService; + } + + public void unsetPluginOutTopologyService(IPluginOutTopologyService pluginOutTopologyService){ + this.pluginOutTopologyService = null; + } + + + public void addEdge(Edge edge, Set properties, UpdateType updateType){ + + List topoedgeupdateList = new ArrayList(); + + topoedgeupdateList.add(new TopoEdgeUpdate(edge, properties, updateType)); + + this.pluginOutTopologyService.edgeUpdate(topoedgeupdateList); + + } +} diff --git a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Action.java b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Action.java index a1bf55ddaf..c1c38aa76c 100644 --- a/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Action.java +++ b/opendaylight/sal/api/src/main/java/org/opendaylight/controller/sal/action/Action.java @@ -8,18 +8,12 @@ package org.opendaylight.controller.sal.action; -import java.io.Serializable; - -import javax.xml.bind.annotation.XmlAccessType; -import javax.xml.bind.annotation.XmlAccessorType; -import javax.xml.bind.annotation.XmlElement; -import javax.xml.bind.annotation.XmlRootElement; -import javax.xml.bind.annotation.XmlSeeAlso; -import javax.xml.bind.annotation.XmlTransient; - import org.slf4j.Logger; import org.slf4j.LoggerFactory; +import javax.xml.bind.annotation.*; +import java.io.Serializable; + /** * Represents the generic action to be applied to the matched * frame/packet/message diff --git a/opendaylight/topologymanager/integrationtest/pom.xml b/opendaylight/topologymanager/integrationtest/pom.xml new file mode 100644 index 0000000000..8d949f42b1 --- /dev/null +++ b/opendaylight/topologymanager/integrationtest/pom.xml @@ -0,0 +1,146 @@ + + + 4.0.0 + + org.opendaylight.controller + commons.integrationtest + 0.5.1-SNAPSHOT + ../../commons/integrationtest + + + scm:git:ssh://git.opendaylight.org:29418/controller.git + scm:git:ssh://git.opendaylight.org:29418/controller.git + https://wiki.opendaylight.org/view/OpenDaylight_Controller:Main + + + topologymanager.integrationtest + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + protocol_plugins.stub + 0.4.1-SNAPSHOT + + + org.opendaylight.controller + sal + 0.5.0-SNAPSHOT + + + org.opendaylight.controller + sal.implementation + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + containermanager + 0.5.0-SNAPSHOT + + + org.opendaylight.controller + containermanager.it.implementation + 0.5.0-SNAPSHOT + + + org.opendaylight.controller + forwardingrulesmanager + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + clustering.services + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + clustering.stub + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + statisticsmanager + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + statisticsmanager.implementation + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + switchmanager.implementation + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + switchmanager + 0.5.0-SNAPSHOT + + + + org.opendaylight.controller + configuration + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + configuration.implementation + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + hosttracker + 0.4.0-SNAPSHOT + + + org.opendaylight.controller + topologymanager + 0.4.0-SNAPSHOT + + + + + jacoco + ../implementation/target/jacoco.exec + ../implementaiton/target/jacoco-it.exec + java + + + + + + org.jacoco + jacoco-maven-plugin + 0.5.3.201107060350 + + + + + + org.jacoco + jacoco-maven-plugin + 0.5.3.201107060350 + + ../implementation/target/jacoco-it.exec + org.opendaylight.controller.* + + + + pre-test + + prepare-agent + + + + post-test + + true + + + + + + + diff --git a/opendaylight/topologymanager/integrationtest/src/test/java/org/opendaylight/controller/topologymanager/TopologyManagerIT.java b/opendaylight/topologymanager/integrationtest/src/test/java/org/opendaylight/controller/topologymanager/TopologyManagerIT.java new file mode 100644 index 0000000000..296be72a13 --- /dev/null +++ b/opendaylight/topologymanager/integrationtest/src/test/java/org/opendaylight/controller/topologymanager/TopologyManagerIT.java @@ -0,0 +1,204 @@ +/* + * 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.topologymanager; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.opendaylight.controller.protocol_plugins.stub.internal.TopologyServices; +import org.opendaylight.controller.sal.core.*; +import org.opendaylight.controller.sal.topology.IPluginInTopologyService; +import org.ops4j.pax.exam.Option; +import org.ops4j.pax.exam.junit.Configuration; +import org.ops4j.pax.exam.junit.PaxExam; +import org.ops4j.pax.exam.util.PathUtils; +import org.osgi.framework.Bundle; +import org.osgi.framework.BundleContext; +import org.osgi.framework.ServiceReference; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; +import java.util.HashSet; +import java.util.Set; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.ops4j.pax.exam.CoreOptions.*; + +@RunWith(PaxExam.class) +public class TopologyManagerIT { + private Logger log = LoggerFactory + .getLogger(TopologyManagerIT.class); + // get the OSGI bundle context + @Inject + private BundleContext bc; + + private ITopologyManager manager = null; + + // Configure the OSGi container + @Configuration + public Option[] config() { + return options( + // + systemProperty("logback.configurationFile").value( + "file:" + PathUtils.getBaseDir() + + "/src/test/resources/logback.xml"), + // To start OSGi console for inspection remotely + systemProperty("osgi.console").value("2401"), + // Set the systemPackages (used by clustering) + systemPackages("sun.reflect", "sun.reflect.misc", "sun.misc"), + // List framework bundles + mavenBundle("equinoxSDK381", "org.eclipse.equinox.console").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.eclipse.equinox.util").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.eclipse.osgi.services").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.eclipse.equinox.ds").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.apache.felix.gogo.command").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.apache.felix.gogo.runtime").versionAsInProject(), + mavenBundle("equinoxSDK381", "org.apache.felix.gogo.shell").versionAsInProject(), + // List logger bundles + mavenBundle("org.slf4j", "slf4j-api").versionAsInProject(), + mavenBundle("org.slf4j", "log4j-over-slf4j") + .versionAsInProject(), + mavenBundle("ch.qos.logback", "logback-core") + .versionAsInProject(), + mavenBundle("ch.qos.logback", "logback-classic") + .versionAsInProject(), + // needed by statisticsmanager + mavenBundle("org.opendaylight.controller", "containermanager") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "containermanager.it.implementation") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "clustering.services") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "clustering.stub") + .versionAsInProject(), + // needed by forwardingrulesmanager + mavenBundle("org.opendaylight.controller", "configuration") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "configuration.implementation") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "hosttracker") + .versionAsInProject(), + + // List all the bundles on which the test case depends + mavenBundle("org.opendaylight.controller", "sal") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "sal.implementation") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "protocol_plugins.stub") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "switchmanager") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "switchmanager.implementation") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "statisticsmanager") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "statisticsmanager.implementation") + .versionAsInProject(), + mavenBundle("org.opendaylight.controller", "forwardingrulesmanager") + .versionAsInProject(), + + // needed by hosttracker + mavenBundle("org.opendaylight.controller", "topologymanager") + .versionAsInProject(), + mavenBundle("org.jboss.spec.javax.transaction", + "jboss-transaction-api_1.1_spec").versionAsInProject(), + mavenBundle("org.apache.commons", "commons-lang3") + .versionAsInProject(), + mavenBundle("org.apache.felix", + "org.apache.felix.dependencymanager") + .versionAsInProject(), junitBundles()); + } + + private String stateToString(int state) { + switch (state) { + case Bundle.ACTIVE: + return "ACTIVE"; + case Bundle.INSTALLED: + return "INSTALLED"; + case Bundle.RESOLVED: + return "RESOLVED"; + case Bundle.UNINSTALLED: + return "UNINSTALLED"; + default: + return "Not CONVERTED"; + } + } + + @Before + public void areWeReady() { + assertNotNull(bc); + boolean debugit = false; + Bundle b[] = bc.getBundles(); + for (int i = 0; i < b.length; i++) { + int state = b[i].getState(); + if (state != Bundle.ACTIVE && state != Bundle.RESOLVED) { + log.debug("Bundle:" + b[i].getSymbolicName() + " state:" + + stateToString(state)); + debugit = true; + } + } + if (debugit) { + log.debug("Do some debugging because some bundle is " + + "unresolved"); + } + + // Assert if true, if false we are good to go! + assertFalse(debugit); + + ServiceReference r = bc.getServiceReference(ITopologyManager.class + .getName()); + if (r != null) { + this.manager = (ITopologyManager) bc.getService(r); + } + // If StatisticsManager is null, cannot run tests. + assertNotNull(this.manager); + + } + + + /** + * This test verifies that the isInternal method of the TopologyManager returns true when a node is internal and + * not otherwise + * + * To make a node interval we add a node using the plugin interface (TopologyServices.addEdge) this is to ensure + * that when TopologyManager sees the edge is via it's dependency on the SAL ITopologyService. + * + * @throws Exception + */ + @Test + public void testIsInternal() throws Exception{ + Node node1 = new Node("STUB", 0xCAFE); + Node node2 = new Node("STUB", 0XFACE); + + NodeConnector head = new NodeConnector("STUB", node1.getID(), node1); + NodeConnector tail = new NodeConnector("STUB", node2.getID(), node2); + + assert(this.manager.isInternal(head)); + + Set properties = new HashSet(); + + ServiceReference r = bc.getServiceReference(IPluginInTopologyService.class + .getName()); + TopologyServices topologyServices = null; + if (r != null) { + if(bc.getService(r) instanceof TopologyServices) { + topologyServices = (TopologyServices) bc.getService(r); + } else { + throw new RuntimeException("topology service registered is not from the stub plugin implementation"); + } + } + + topologyServices.addEdge(new Edge(tail, head), properties, UpdateType.ADDED); + + assert(this.manager.isInternal(head)); + } + +} diff --git a/opendaylight/topologymanager/integrationtest/src/test/resources/logback.xml b/opendaylight/topologymanager/integrationtest/src/test/resources/logback.xml new file mode 100644 index 0000000000..2d63ce5744 --- /dev/null +++ b/opendaylight/topologymanager/integrationtest/src/test/resources/logback.xml @@ -0,0 +1,13 @@ + + + + + %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n + + + + + + + + diff --git a/opendaylight/usermanager/api/src/test/java/org/opendaylight/controller/usermanager/AuthenticatedUserTest.java b/opendaylight/usermanager/api/src/test/java/org/opendaylight/controller/usermanager/AuthenticatedUserTest.java index d16373c349..b8a1a98769 100644 --- a/opendaylight/usermanager/api/src/test/java/org/opendaylight/controller/usermanager/AuthenticatedUserTest.java +++ b/opendaylight/usermanager/api/src/test/java/org/opendaylight/controller/usermanager/AuthenticatedUserTest.java @@ -8,17 +8,15 @@ package org.opendaylight.controller.usermanager; -import java.util.Arrays; -import java.util.List; - import org.junit.Assert; import org.junit.BeforeClass; import org.junit.Test; - import org.opendaylight.controller.sal.authorization.UserLevel; -import org.opendaylight.controller.usermanager.AuthenticatedUser; import org.springframework.security.core.GrantedAuthority; +import java.util.Arrays; +import java.util.List; + public class AuthenticatedUserTest { static String[] roleArray; @@ -64,6 +62,7 @@ public class AuthenticatedUserTest { @Test public void testGetGrantedAuthorities() { + user = new AuthenticatedUser("auser"); List gaList = user .getGrantedAuthorities(UserLevel.NETWORKOPERATOR); Assert.assertTrue(gaList.get(0).getAuthority() -- 2.36.6