</configuration>
<required-capabilities>
+ <!-- openflowplugin applications -->
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:inventory-manager:impl?module=inventory-manager-impl&revision=2015-05-30
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:topology-manager:impl?module=topology-manager-impl&revision=2015-05-30
+ </capability>
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:openflowplugin:app:statistics-manager?module=statistics-manager&revision=2014-09-25
+ </capability>
+
+ <!-- Required YANG models: openflowplugin -->
+ <capability>
+ urn:opendaylight:flow:service?module=sal-flow&revision=2013-08-19
+ </capability>
+ <capability>
+ urn:opendaylight:flow:statistics?module=opendaylight-flow-statistics&revision=2013-08-19
+ </capability>
+ <capability>
+ urn:opendaylight:packet:service?module=packet-processing&revision=2013-07-09
+ </capability>
+
+ <!-- Required YANG models: VTN -->
+ <capability>
+ urn:opendaylight:vtn?module=vtn&revision=2015-03-28
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:config?module=vtn-config&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:pathmap?module=vtn-path-map&revision=2015-03-28
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:pathpolicy?module=vtn-path-policy&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:flow?module=vtn-flow-impl&revision=2015-03-13
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:inventory?module=vtn-inventory&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:topology?module=vtn-topology&revision=2015-02-09
+ </capability>
+
+ <!-- VTN Manager -->
<capability>
urn:opendaylight:vtn:impl:provider?module=vtn-provider&revision=2015-02-09
</capability>
// Create port 1.
// This will establish port mapping on bipathNode2Port1.
- pids[2][1] = ofMockService.addPort(nid2, 1L, false);
+ pids[2][1] = ofMockService.addPort(nid2, 1L);
waiter.set(bipathNode2Port1, VnodeState.DOWN, VnodeState.DOWN).await();
// Enable port 1.
// Cause path fault.
unicastTest(bridge, islPorts, false);
+ // Packet processing for previous test may not complete.
+ // So we need to install a valid flow entry here in order to
+ // synchronize packet processing.
+ Map<String, List<TestHost>> hostMap = bridge.getTestHosts();
+ Set<String> edgeNodes = new HashSet<>();
+ for (Map.Entry<String, List<TestHost>> entry: hostMap.entrySet()) {
+ List<TestHost> hosts = entry.getValue();
+ if (hosts.size() >= 2) {
+ edgeNodes.add(entry.getKey());
+ TestHost src = hosts.get(0);
+ TestHost dst = hosts.get(1);
+ ArpFlowFactory factory = new ArpFlowFactory(ofMockService);
+ List<OfMockLink> route = Collections.<OfMockLink>emptyList();
+ UnicastFlow unicast = factory.create(src, dst, route);
+ unicast.runTest();
+ assertEquals(1, unicast.getFlowCount());
+ }
+ }
+ assertFalse(edgeNodes.isEmpty());
+
+ for (String nid: ofMockService.getNodes()) {
+ int expected = (edgeNodes.contains(nid)) ? 1 : 0;
+ assertEquals(expected, ofMockService.getFlowCount(nid));
+ }
+
// Resolve path fault.
unicastTest(bridge, islPorts, true);
for (int j = 1; j <= numNodes; j++) {
String pid = ofMockService.addPort(nid, (long)j, false);
assertEquals(null, allPorts.put(pid, null));
- ofMockService.setPortState(pid, true, false);
+ ofMockService.setPortState(pid, true);
}
}
*/
private VtnConfig vtnConfig;
- /**
- * Keep {@code true} if inventory information is not yet initialized.
- */
- private boolean firstRun = true;
-
/**
* Construct a new instance.
*
* @param n A {@link Notification} instance.
*/
public void publish(Notification n) {
- notificationService.publish(n, globalExecutor);
+ if (serviceAvailable) {
+ notificationService.publish(n, globalExecutor);
+ }
}
/**
*
* @param allPorts A list of {@link OfPort} instances which represents
* all the physical ports present in the test environment.
+ * @param links A map that keeps inter-switch links to be configured.
+ * {@code null} is specified if inventory information is
+ * already initialized.
* @throws InterruptedException
* The calling thread was interrupted.
*/
- private void initInventory(List<OfPort> allPorts)
+ private void initInventory(List<OfPort> allPorts,
+ Map<String, String> links)
throws InterruptedException {
- if (!firstRun) {
+ if (links == null) {
for (OfPort port: allPorts) {
String src = port.getPortIdentifier();
String peer = port.getPeerIdentifier();
return;
}
- firstRun = false;
-
- // OpenFlow application, such as topology manager, may not be started.
- // So we need to resend inventory and topology notifications for
- // missing inventories.
+ // MD-SAL inventory manager may not be started.
+ // So we need to resend notifications for missing inventories.
for (OfNode node: switches.values()) {
verify(node);
}
- List<OfPort> isl = new ArrayList<>();
+ // We need to ensure that all the switch ports are registered into
+ // MD-SAL nodes container before notifying link discovery.
+ // MD-SAL topology manager will delete links on newly created ports.
for (OfPort port: allPorts) {
verify(port);
+ }
- String peer = port.getPeerIdentifier();
- if (peer != null && port.isUp()) {
+ // Set up inter-switch links.
+ List<OfPort> isl = new ArrayList<>();
+ for (OfPort port: allPorts) {
+ String pid = port.getPortIdentifier();
+ String peer = links.get(pid);
+ if (peer != null) {
+ port.setPeerIdentifier(this, peer);
isl.add(port);
}
}
public void initialize() throws InterruptedException {
boolean done = false;
List<OfPort> allPorts = new ArrayList<>();
+ Map<String, String> links = null;
+
Lock wrlock = rwLock.writeLock();
wrlock.lock();
try {
if (switches.isEmpty()) {
+ links = new HashMap<>();
VtnOpenflowVersion of13 = VtnOpenflowVersion.OF13;
VtnOpenflowVersion[] vers = {
VtnOpenflowVersion.OF10,
OfPort peer = node1.addPort((long)(i + 1));
allPorts.add(port);
allPorts.add(peer);
- port.setPeerIdentifier(this, peer.getPortIdentifier());
- peer.setPeerIdentifier(this, port.getPortIdentifier());
+ String portId = port.getPortIdentifier();
+ String peerId = peer.getPortIdentifier();
+ links.put(portId, peerId);
+ links.put(peerId, portId);
// Create 2 edge ports.
for (long p = MIN_EDGE_PORT_ID; p <= MAX_EDGE_PORT_ID;
}
// Ensure that all inventory events have been notified.
- initInventory(allPorts);
+ initInventory(allPorts, links);
LOG.debug("Test environment has been initialized.");
}
/**
* Construct a new instance.
*
- * @param xid
+ * @param xid OpenFlow transaction ID.
* @param cond The MD-SAL flow entry which specifies the condition to
* select flow entries.
*/
mavenBundle(OPENFLOW, "openflowplugin-common"),
mavenBundle(OPENFLOW_APPS, "inventory-manager"),
mavenBundle(OPENFLOW_APPS, "topology-manager"),
- mavenBundle(OPENFLOW_APPS, "forwardingrules-manager"),
// VTN Manager bundels.
mavenBundle(VTN, "manager"),
<module>
<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-notification-broker</type>
<name>binding-notification-broker</name>
+ <notification-adapter xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-new-notification-service</type>
+ <name>binding-notification-adapter</name>
+ </notification-adapter>
+ <notification-publish-adapter xmlns="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-new-notification-publish-service</type>
+ <name>binding-notification-publish-adapter</name>
+ </notification-publish-adapter>
</module>
<module>
<type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding:impl">prefix:binding-broker-impl</type>
</binding-forwarded-data-broker>
</module>
- <!-- forwardingrules-manager configuration -->
+ <!-- inventory-manager configuration -->
<module>
- <type xmlns:frm="urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager">
- frm:forwardingrules-manager
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:inventory-manager:impl">
+ prefix:inventory-manager-impl
</type>
- <name>forwardingrules-manager</name>
+ <name>inventory-manager-default</name>
- <data-broker>
+ <broker>
<type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
- binding:binding-async-data-broker
+ binding:binding-broker-osgi-registry
</type>
- <name>binding-data-broker</name>
- </data-broker>
+ <name>binding-osgi-broker</name>
+ </broker>
+ </module>
- <rpc-registry>
+ <!-- topology-manager configuration -->
+ <module>
+ <type xmlns:prefix="urn:opendaylight:params:xml:ns:yang:topology-manager:impl">
+ prefix:topology-manager-impl
+ </type>
+ <name>topology-manager-default</name>
+ <broker>
<type xmlns:binding="urn:opendaylight:params:xml:ns:yang:controller:md:sal:binding">
- binding:binding-rpc-registry
+ binding:binding-broker-osgi-registry
</type>
- <name>binding-rpc-broker</name>
- </rpc-registry>
+ <name>binding-osgi-broker</name>
+ </broker>
</module>
<!-- openflowplugin mock-up configuration -->
<capability>urn:opendaylight:params:xml:ns:yang:controller:md:sal:core:spi:operational-dom-store?module=opendaylight-operational-dom-datastore&revision=2014-06-17</capability>
<capability>urn:opendaylight:params:xml:ns:yang:controller:inmemory-datastore-provider?module=opendaylight-inmemory-datastore-provider&revision=2014-06-17</capability>
- <!-- forwardingrules-manager capabilities -->
+ <!-- Required YANG models: yangtools -->
+ <capability>urn:TBD:params:xml:ns:yang:network-topology?module=network-topology&revision=2013-10-21</capability>
+
+ <!-- Required YANG models: controller -->
+ <capability>urn:opendaylight:inventory?module=opendaylight-inventory&revision=2013-08-19</capability>
+
+ <!-- Required YANG models: openflowplugin -->
+ <capability>urn:opendaylight:flow:inventory?module=flow-node-inventory&revision=2013-08-19</capability>
+ <capability>urn:opendaylight:flow:topology:discovery?module=flow-topology-discovery&revision=2013-08-19</capability>
+ <capability>urn:opendaylight:flow:types?module=opendaylight-flow-types&revision=2013-10-26</capability>
+ <capability>urn:opendaylight:flow:service?module=sal-flow&revision=2013-08-19</capability>
+ <capability>urn:opendaylight:group:service?module=sal-group&revision=2013-09-18</capability>
+ <capability>urn:opendaylight:meter:service?module=sal-meter&revision=2013-09-18</capability>
+ <capability>urn:opendaylight:port:service?module=sal-port&revision=2013-11-07</capability>
+ <capability>urn:opendaylight:queue:service?module=sal-queue&revision=2015-03-05</capability>
+ <capability>urn:opendaylight:table:service?module=sal-table&revision=2013-10-26</capability>
+ <capability>urn:opendaylight:packet:service?module=packet-processing&revision=2013-07-09</capability>
+ <capability>urn:opendaylight:flow:statistics?module=opendaylight-flow-statistics&revision=2013-08-19</capability>
+
+ <!-- Required YANG models: VTN -->
+ <capability>
+ urn:opendaylight:vtn?module=vtn&revision=2015-03-28
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:config?module=vtn-config&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:pathmap?module=vtn-path-map&revision=2015-03-28
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:pathpolicy?module=vtn-path-policy&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:flow?module=vtn-flow-impl&revision=2015-03-13
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:inventory?module=vtn-inventory&revision=2015-02-09
+ </capability>
+ <capability>
+ urn:opendaylight:vtn:impl:topology?module=vtn-topology&revision=2015-02-09
+ </capability>
+
+ <!-- inventory-manager capabilities -->
<capability>
- urn:opendaylight:params:xml:ns:yang:openflowplugin:app:forwardingrules-manager?module=forwardingrules-manager&revision=2014-09-25
+ urn:opendaylight:params:xml:ns:yang:inventory-manager:impl?module=inventory-manager-impl&revision=2015-05-30
</capability>
+ <!-- topology-manager capabilities -->
+ <capability>
+ urn:opendaylight:params:xml:ns:yang:topology-manager:impl?module=topology-manager-impl&revision=2015-05-30
+ </capability>
+
<!-- openflowplugin mock-up capabilities -->
<capability>
urn:opendaylight:vtn:it:ofmock:provider?module=ofmock-provider&revision=2015-02-09
<module>option</module>
<module>util</module>
<module>common</module>
- <!--
<module>core</module>
<module>northbound</module>
- -->
</modules>
</project>