cleanup networking api, rest and cli and unittest
[osm/vim-emu.git] / src / emuvim / test / unittests / test_emulator.py
index 80ac1d1..94db55f 100755 (executable)
@@ -1,4 +1,31 @@
 """
+Copyright (c) 2015 SONATA-NFV
+ALL RIGHTS RESERVED.
+
+Licensed under the Apache License, Version 2.0 (the "License");
+you may not use this file except in compliance with the License.
+You may obtain a copy of the License at
+
+    http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing, software
+distributed under the License is distributed on an "AS IS" BASIS,
+WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+See the License for the specific language governing permissions and
+limitations under the License.
+
+Neither the name of the SONATA-NFV [, ANY ADDITIONAL AFFILIATION]
+nor the names of its contributors may be used to endorse or promote
+products derived from this software without specific prior written
+permission.
+
+This work has been performed in the framework of the SONATA project,
+funded by the European Commission under Grant number 671517 through
+the Horizon 2020 and 5G-PPP programmes. The authors would like to
+acknowledge the contributions of their colleagues of the SONATA
+partner consortium (www.sonata-nfv.eu).
+"""
+"""
 Test suite to automatically test emulator functionalities.
 Directly interacts with the emulator through the Mininet-like
 Python API.
@@ -90,6 +117,57 @@ class testEmulatorTopology( SimpleTestTopology ):
 
 class testEmulatorNetworking( SimpleTestTopology ):
 
+    def testSDNChainingSingleService_withLearning(self):
+        """
+        Create a two data centers and interconnect them with additional
+        switches between them.
+        Uses Ryu SDN controller.
+        Connect the Docker hosts to different datacenters and setup the links between.
+        """
+        # create network
+        self.createNet(
+            nswitches=3, ndatacenter=2, nhosts=0, ndockers=0,
+            autolinkswitches=True,
+            controller=RemoteController,
+            enable_learning=True)
+        # setup links
+        self.net.addLink(self.dc[0], self.s[0])
+        self.net.addLink(self.s[2], self.dc[1])
+        # start Mininet network
+        self.startNet()
+
+        # add compute resources
+        vnf1 = self.dc[0].startCompute("vnf1", network=[{'id':'intf1', 'ip':'10.0.10.1/24'}])
+        vnf2 = self.dc[1].startCompute("vnf2", network=[{'id':'intf2', 'ip':'10.0.10.2/24'}])
+        # check number of running nodes
+        self.assertTrue(len(self.getContainernetContainers()) == 2)
+        self.assertTrue(len(self.net.hosts) == 2)
+        self.assertTrue(len(self.net.switches) == 5)
+        # check status
+        # check get status
+        s1 = self.dc[0].containers.get("vnf1").getStatus()
+        print s1
+        self.assertTrue(s1["name"] == "vnf1")
+        self.assertTrue(s1["state"]["Running"])
+        self.assertTrue(s1["network"][0]['intf_name'] == 'intf1')
+        self.assertTrue(s1["network"][0]['ip'] == '10.0.10.1/24')
+
+        s2 = self.dc[1].containers.get("vnf2").getStatus()
+        print s2
+        self.assertTrue(s2["name"] == "vnf2")
+        self.assertTrue(s2["state"]["Running"])
+        self.assertTrue(s2["network"][0]['intf_name'] == 'intf2')
+        self.assertTrue(s2["network"][0]['ip'] == '10.0.10.2/24')
+
+        # should be connected because learning = True
+        self.assertTrue(self.net.ping([vnf1, vnf2]) <= 0.0)
+        # setup links
+        self.net.setChain('vnf1', 'vnf2', 'intf1', 'intf2', bidirectional=True, cmd='add-flow')
+        # should still be connected
+        self.assertTrue(self.net.ping([vnf1, vnf2]) <= 0.0)
+        # stop Mininet network
+        self.stopNet()
+
     def testSDNChainingSingleService(self):
         """
         Create a two data centers and interconnect them with additional
@@ -119,17 +197,21 @@ class testEmulatorNetworking( SimpleTestTopology ):
         # check status
         # check get status
         s1 = self.dc[0].containers.get("vnf1").getStatus()
+        print s1
         self.assertTrue(s1["name"] == "vnf1")
         self.assertTrue(s1["state"]["Running"])
         self.assertTrue(s1["network"][0]['intf_name'] == 'intf1')
-        self.assertTrue(s1["network"][0]['ip'] == '10.0.10.1')
+        self.assertTrue(s1["network"][0]['ip'] == '10.0.10.1/24')
 
         s2 = self.dc[1].containers.get("vnf2").getStatus()
+        print s2
         self.assertTrue(s2["name"] == "vnf2")
         self.assertTrue(s2["state"]["Running"])
         self.assertTrue(s2["network"][0]['intf_name'] == 'intf2')
-        self.assertTrue(s2["network"][0]['ip'] == '10.0.10.2')
+        self.assertTrue(s2["network"][0]['ip'] == '10.0.10.2/24')
 
+        # should be not not yet connected
+        self.assertTrue(self.net.ping([vnf1, vnf2]) > 0.0)
         # setup links
         self.net.setChain('vnf1', 'vnf2', 'intf1', 'intf2', bidirectional=True, cmd='add-flow')
         # check connectivity by using ping