Merge pull request #98 from mpeuster/master
authorpeusterm <manuel.peuster@uni-paderborn.de>
Wed, 11 May 2016 13:37:45 +0000 (15:37 +0200)
committerpeusterm <manuel.peuster@uni-paderborn.de>
Wed, 11 May 2016 13:37:45 +0000 (15:37 +0200)
Integration with new Containernet

12 files changed:
Dockerfile [new symlink]
README.md
ansible/install.yml
setup.py
src/emuvim/dcemulator/net.py
src/emuvim/dcemulator/node.py
src/emuvim/test/base.py
src/emuvim/test/test_emulator.py
src/emuvim/test/test_resourcemodel.py
src/emuvim/test/test_sonata_dummy_gatekeeper.py
utils/docker/Dockerfile
utils/docker/entrypoint.sh

diff --git a/Dockerfile b/Dockerfile
new file mode 120000 (symlink)
index 0000000..a0f6cc3
--- /dev/null
@@ -0,0 +1 @@
+utils/docker/Dockerfile
\ No newline at end of file
index 1042a7f..6d54ca5 100755 (executable)
--- a/README.md
+++ b/README.md
@@ -2,29 +2,35 @@
 
 # Distributed Cloud Emulator
 
-## Lead Developers
+### Lead Developers
 The following lead developers are responsible for this repository and have admin rights. They can, for example, merge pull requests.
 
-
 * Manuel Peuster (mpeuster)
 * Steven Van Rossem (stevenvanrossem)
 
+### Environment
+* Python 2.7
+* Latest [Containernet](https://github.com/mpeuster/containernet) installed on the system
+
 ### Dependencies
-* needs the latest [Dockernet](https://github.com/mpeuster/dockernet) to be installed on the system
-* pyaml
-* zerorpc
-* tabulate
-* argparse
-* networkx
-* six>=1.9
-* ryu
-* oslo.config
-* pytest
-* pytest-runner
-* Flask
-* flask_restful
-* requests 
-* docker-py
+* pyaml (public domain)
+* zerorpc (MIT)
+* tabulate (public domain)
+* argparse (Python software foundation license)
+* networkx (BSD)
+* six>=1.9 (MIT)
+* ryu (Apache 2.0)
+* oslo.config (Apache 2.0)
+* pytest (MIT)
+* pytest-runner (MIT)
+* Flask (BSD)
+* flask_restful (BSD)
+* requests  (Apache 2.0)
+* docker-py (Apache 2.0)
+* paramiko (LGPL)
+
+### 3rd-party code used
+* (none)
 
 
 ### Project structure
@@ -32,7 +38,7 @@ The following lead developers are responsible for this repository and have admin
 * **src/emuvim/** all emulator code 
  * **api/** Data center API endpoint implementations (zerorpc, OpenStack REST, ...)
  * **cli/** CLI client to interact with a running emulator
- * **dcemulator/** Dockernet wrapper that introduces the notion of data centers and API endpoints
+ * **dcemulator/** Containernet wrapper that introduces the notion of data centers and API endpoints
  * **examples/** Example topology scripts
  * **test/** Unit tests
 * **ansible/** Ansible install scripts
@@ -46,10 +52,10 @@ Automatic installation is provide through Ansible playbooks.
 * `sudo vim /etc/ansible/hosts`
 * Add: `localhost ansible_connection=local`
 
-#### 1. Dockernet
+#### 1. Containernet
 * `cd`
-* `git clone -b dockernet-sonata https://github.com/mpeuster/dockernet.git`
-* `cd ~/dockernet/ansible`
+* `git clone https://github.com/mpeuster/containernet.git`
+* `cd ~/containernet/ansible`
 * `sudo ansible-playbook install.yml`
 * Wait (and have a coffee) ...
 
@@ -77,7 +83,7 @@ In the `~/son-emu` directory:
  * `son-emu-cli compute start -d datacenter1 -n vnf2`
  * `son-emu-cli compute list`
 * First terminal:
- * `dockernet> vnf1 ping -c 2 vnf2`
+ * `containernet> vnf1 ping -c 2 vnf2`
 * Second terminal:
  *  `son-emu-cli monitor get_rate -vnf vnf1`
 
index b31615e..7fed451 100755 (executable)
    - name: install libzmq-dev
      apt: pkg=libzmq-dev state=installed
 
+   - name: install libffi-dev
+     apt: pkg=libffi-dev state=installed
+
+   - name: install libssl-dev
+     apt: pkg=libssl-dev state=installed
+
    - name: install pip
      apt: pkg=python-pip state=installed
 
      pip: name=requests state=latest
 
    - name: install docker-py
-     pip: name=docker-py state=latest
+     pip: name=docker-py version=1.7.1
 
    - name: install prometheus_client
      pip: name=prometheus_client state=latest
 
+   - name: install paramiko
+     pip: name=paramiko state=latest
+
+   - name: install latest urllib3 (fix error urllib3.connection.match_hostname = match_hostname)
+     pip: name=urllib3 state=latest
+
 
 
index 367c4fb..3657816 100644 (file)
--- a/setup.py
+++ b/setup.py
@@ -2,7 +2,7 @@ from setuptools import setup, find_packages
 
 setup(name='emuvim',
       version='0.0.1',
-      license='TODO',
+      license='Apache 2.0',
       description='emuvim is a VIM for the SONATA platform',
       url='http://github.com/sonata-emu',
       author_email='sonata-dev@sonata-nfv.eu',
@@ -21,9 +21,11 @@ setup(name='emuvim',
           'pytest',
           'Flask',
           'flask_restful',
-          'docker-py',
+          'docker-py==1.7.1',
           'requests',
-         'prometheus_client'
+          'prometheus_client',
+          'paramiko',
+          'urllib3'
       ],
       zip_safe=False,
       entry_points={
index 248dc34..7f31a46 100755 (executable)
@@ -12,7 +12,7 @@ import re
 import urllib2
 from functools import partial
 
-from mininet.net import Dockernet
+from mininet.net import Containernet
 from mininet.node import Controller, DefaultController, OVSSwitch, OVSKernelSwitch, Docker, RemoteController
 from mininet.cli import CLI
 from mininet.link import TCLink
@@ -21,9 +21,9 @@ from emuvim.dcemulator.monitoring import DCNetworkMonitor
 from emuvim.dcemulator.node import Datacenter, EmulatorCompute
 from emuvim.dcemulator.resourcemodel import ResourceModelRegistrar
 
-class DCNetwork(Dockernet):
+class DCNetwork(Containernet):
     """
-    Wraps the original Mininet/Dockernet class and provides
+    Wraps the original Mininet/Containernet class and provides
     methods to add data centers, switches, etc.
 
     This class is used by topology definition scripts.
@@ -34,7 +34,7 @@ class DCNetwork(Dockernet):
                  dc_emulation_max_mem=512,  # emulation max mem in MB
                  **kwargs):
         """
-        Create an extended version of a Dockernet network
+        Create an extended version of a Containernet network
         :param dc_emulation_max_cpu: max. CPU time used by containers in data centers
         :param kwargs: path through for Mininet parameters
         :return:
@@ -42,7 +42,7 @@ class DCNetwork(Dockernet):
         self.dcs = {}
 
         # call original Docker.__init__ and setup default controller
-        Dockernet.__init__(
+        Containernet.__init__(
             self, switch=OVSKernelSwitch, **kwargs)
 
         # Ryu management
@@ -121,11 +121,11 @@ class DCNetwork(Dockernet):
                 params["params2"]["ip"] = self.getNextIp()
         # ensure that we allow TCLinks between data centers
         # TODO this is not optimal, we use cls=Link for containers and TCLink for data centers
-        # see Dockernet issue: https://github.com/mpeuster/dockernet/issues/3
+        # see Containernet issue: https://github.com/mpeuster/containernet/issues/3
         if "cls" not in params:
             params["cls"] = TCLink
 
-        link = Dockernet.addLink(self, node1, node2, **params)
+        link = Containernet.addLink(self, node1, node2, **params)
 
         # try to give container interfaces a default id
         node1_port_id = node1.ports[link.intf1]
@@ -143,7 +143,7 @@ class DCNetwork(Dockernet):
 
         # add edge and assigned port number to graph in both directions between node1 and node2
         # port_id: id given in descriptor (if available, otherwise same as port)
-        # port: portnumber assigned by Dockernet
+        # port: portnumber assigned by Containernet
 
         attr_dict = {}
         # possible weight metrics allowed by TClink class:
@@ -180,14 +180,14 @@ class DCNetwork(Dockernet):
         Wrapper for addDocker method to use custom container class.
         """
         self.DCNetwork_graph.add_node(label)
-        return Dockernet.addDocker(self, label, cls=EmulatorCompute, **params)
+        return Containernet.addDocker(self, label, cls=EmulatorCompute, **params)
 
     def removeDocker( self, label, **params ):
         """
         Wrapper for removeDocker method to update graph.
         """
         self.DCNetwork_graph.remove_node(label)
-        return Dockernet.removeDocker(self, label, **params)
+        return Containernet.removeDocker(self, label, **params)
 
     def addSwitch( self, name, add_to_graph=True, **params ):
         """
@@ -195,7 +195,7 @@ class DCNetwork(Dockernet):
         """
         if add_to_graph:
             self.DCNetwork_graph.add_node(name)
-        return Dockernet.addSwitch(self, name, protocols='OpenFlow10,OpenFlow12,OpenFlow13', **params)
+        return Containernet.addSwitch(self, name, protocols='OpenFlow10,OpenFlow12,OpenFlow13', **params)
 
     def getAllContainers(self):
         """
@@ -210,7 +210,7 @@ class DCNetwork(Dockernet):
         # start
         for dc in self.dcs.itervalues():
             dc.start()
-        Dockernet.start(self)
+        Containernet.start(self)
 
     def stop(self):
 
@@ -219,7 +219,7 @@ class DCNetwork(Dockernet):
             self.monitor_agent.stop()
 
         # stop emulator net
-        Dockernet.stop(self)
+        Containernet.stop(self)
 
         # stop Ryu controller
         self.stopRyu()
index 3258a9f..f9328e3 100755 (executable)
@@ -19,7 +19,7 @@ DCDPID_BASE = 1000  # start of switch dpid's used for data center switches
 class EmulatorCompute(Docker):
     """
     Emulator specific compute node class.
-    Inherits from Dockernet's Docker host class.
+    Inherits from Containernet's Docker host class.
     Represents a single container connected to a (logical)
     data center.
     We can add emulator specific helper functions to it.
@@ -168,7 +168,7 @@ class Datacenter(object):
         # if no --net option is given, network = [{}], so 1 empty dict in the list
         # this results in 1 default interface with a default ip address
         for nw in network:
-            # TODO we cannot use TCLink here (see: https://github.com/mpeuster/dockernet/issues/3)
+            # TODO we cannot use TCLink here (see: https://github.com/mpeuster/containernet/issues/3)
             self.net.addLink(d, self.switch, params1=nw, cls=Link, intfName1=nw.get('id'))
         # do bookkeeping
         self.containers[name] = d
index 4bad515..5a83547 100644 (file)
@@ -74,11 +74,11 @@ class SimpleTestTopology(unittest.TestCase):
                 base_url='unix://var/run/docker.sock')
         return self.docker_cli
 
-    def getDockernetContainers(self):
+    def getContainernetContainers(self):
         """
-        List the containers managed by dockernet
+        List the containers managed by containernet
         """
-        return self.getDockerCli().containers(filters={"label": "com.dockernet"})
+        return self.getDockerCli().containers(filters={"label": "com.containernet"})
 
     @staticmethod
     def setUp():
@@ -90,7 +90,7 @@ class SimpleTestTopology(unittest.TestCase):
         # make sure that all pending docker containers are killed
         with open(os.devnull, 'w') as devnull:
             subprocess.call(
-                "sudo docker rm -f $(sudo docker ps --filter 'label=com.dockernet' -a -q)",
+                "sudo docker rm -f $(sudo docker ps --filter 'label=com.containernet' -a -q)",
                 stdout=devnull,
                 stderr=devnull,
                 shell=True)
\ No newline at end of file
index 2038116..243f050 100755 (executable)
@@ -32,7 +32,7 @@ class testEmulatorTopology( SimpleTestTopology ):
         # start Mininet network
         self.startNet()
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check connectivity by using ping
@@ -54,7 +54,7 @@ class testEmulatorTopology( SimpleTestTopology ):
         # start Mininet network
         self.startNet()
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 2)
         # check connectivity by using ping
@@ -79,7 +79,7 @@ class testEmulatorTopology( SimpleTestTopology ):
         # start Mininet network
         self.startNet()
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 5)
         # check connectivity by using ping
@@ -110,7 +110,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         # add compute resources
         vnf1 = self.dc[0].startCompute("vnf1")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 1)
+        self.assertTrue(len(self.getContainernetContainers()) == 1)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check compute list result
@@ -136,7 +136,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         # add compute resources
         vnf1 = self.dc[0].startCompute("vnf1")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 1)
+        self.assertTrue(len(self.getContainernetContainers()) == 1)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check compute list result
@@ -146,7 +146,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         # remove compute resources
         self.dc[0].stopCompute("vnf1")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 1)
         self.assertTrue(len(self.net.switches) == 1)
         # check compute list result
@@ -168,7 +168,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         # add compute resources
         vnf1 = self.dc[0].startCompute("vnf1")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 1)
+        self.assertTrue(len(self.getContainernetContainers()) == 1)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check compute list result
@@ -202,7 +202,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         vnf1 = self.dc[0].startCompute("vnf1")
         vnf2 = self.dc[1].startCompute("vnf2")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 2)
+        self.assertTrue(len(self.getContainernetContainers()) == 2)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 5)
         # check compute list result
@@ -231,7 +231,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         vnf1 = self.dc[0].startCompute("vnf1")
         vnf2 = self.dc[1].startCompute("vnf2")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 2)
+        self.assertTrue(len(self.getContainernetContainers()) == 2)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 5)
         # check compute list result
@@ -242,7 +242,7 @@ class testEmulatorCompute( SimpleTestTopology ):
         # remove compute resources
         self.dc[0].stopCompute("vnf1")
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 1)
+        self.assertTrue(len(self.getContainernetContainers()) == 1)
         self.assertTrue(len(self.net.hosts) == 1)
         self.assertTrue(len(self.net.switches) == 5)
         # check compute list result
index 1817a25..a1d273c 100644 (file)
@@ -41,7 +41,7 @@ class testResourceModel(SimpleTestTopology):
         # start Mininet network
         self.startNet()
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check resource model and resource model registrar
@@ -213,7 +213,7 @@ class testUpbSimpleCloudDcRM(SimpleTestTopology):
 
     def testInRealTopo(self):
         """
-        Start a real container and check if limitations are really passed down to Dockernet.
+        Start a real container and check if limitations are really passed down to Conteinernet.
         :return:
         """
         # ATTENTION: This test should only be executed if emu runs not inside a Docker container,
@@ -231,7 +231,7 @@ class testUpbSimpleCloudDcRM(SimpleTestTopology):
         # start Mininet network
         self.startNet()
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 0)
+        self.assertTrue(len(self.getContainernetContainers()) == 0)
         self.assertTrue(len(self.net.hosts) == 2)
         self.assertTrue(len(self.net.switches) == 1)
         # check resource model and resource model registrar
index db3fd92..33a1d57 100644 (file)
@@ -60,7 +60,7 @@ class testSonataDummyGatekeeper(SimpleTestTopology):
         self.assertEqual(len(r4.json().get("service_instance_list")), 1)
 
         # check number of running nodes
-        self.assertTrue(len(self.getDockernetContainers()) == 3)
+        self.assertTrue(len(self.getContainernetContainers()) == 3)
         self.assertTrue(len(self.net.hosts) == 5)
         self.assertTrue(len(self.net.switches) == 2)
         # check compute list result
index 2c1bda6..7270ab5 100644 (file)
@@ -1,20 +1,16 @@
-FROM cgeoffroy/dockernet
+FROM mpeuster/containernet
+MAINTAINER manuel@peuster.de
 
 ENV SON_EMU_IN_DOCKER 1
 
-# ensure that we have the latest dockernet code base!
-WORKDIR /
-RUN rm -rf dockernet
-RUN git clone -b dockernet-sonata https://github.com/mpeuster/dockernet.git
-WORKDIR /dockernet
-RUN python setup.py develop
-
 WORKDIR /son-emu
 COPY . /son-emu/
 
 RUN cd /son-emu/ansible \
     && ansible-playbook install.yml \
     && cd /son-emu \
+    # we need to reset the __pycache__ for correct test discovery
+    && rm -rf src/emuvim/test/__pycache__ \
     && python setup.py install \
     && echo 'Done'
 
index 580762f..7e72914 100755 (executable)
@@ -1,7 +1,7 @@
 #! /bin/bash -e
 set -x
 
-#cp /dockernet/util/docker/entrypoint.sh /tmp/x.sh
-#cat /tmp/x.sh | awk 'NR==1{print; print "set -x"} NR!=1' > /dockernet/util/docker/entrypoint.sh
+#cp /containernet/util/docker/entrypoint.sh /tmp/x.sh
+#cat /tmp/x.sh | awk 'NR==1{print; print "set -x"} NR!=1' > /conteinernet/util/docker/entrypoint.sh
 
-exec /dockernet/util/docker/entrypoint.sh $*
+exec /containernet/util/docker/entrypoint.sh $*