Possibility to deploy external (as host interface) and internal (as container, default) SAPs.
This is specified in the NSD, by the connection_points type (external/internal)
diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py
index 269a7e0..ce24a40 100755
--- a/src/emuvim/dcemulator/monitoring.py
+++ b/src/emuvim/dcemulator/monitoring.py
@@ -34,7 +34,7 @@
 from prometheus_client import start_http_server, Summary, Histogram, Gauge, Counter, REGISTRY, CollectorRegistry, \

     pushadd_to_gateway, push_to_gateway, delete_from_gateway

 import threading

-from subprocess import Popen

+from subprocess import Popen, check_call

 import os

 import docker

 import json

@@ -535,8 +535,15 @@
 

     def _stop_container(self, name):

 

-        container = self.dockercli.containers.get(name)

-        container.remove(force=True)

+        #container = self.dockercli.containers.get(name)

+        #container.stop()

+        #container.remove(force=True)

+

+        # the only robust way to stop these containers is via Popen, it seems

+        time.sleep(1)

+        cmd = ['docker', 'rm', '-f', name]

+        Popen(cmd)

+

 

     def update_skewmon(self, vnf_name, resource_name, action):

 

diff --git a/src/emuvim/dcemulator/node.py b/src/emuvim/dcemulator/node.py
index c5ac9b3..e0eb7d3 100755
--- a/src/emuvim/dcemulator/node.py
+++ b/src/emuvim/dcemulator/node.py
@@ -246,6 +246,24 @@
 
         return True
 
+    def attachExternalSAP(self, sap_name, sap_ip):
+        # create SAP as OVS internal interface
+        sap_intf = self.switch.attachInternalIntf(sap_name, sap_ip)
+
+        # add this as a link to the DCnetwork graph, so it is available for routing
+        attr_dict2 = {'src_port_id': sap_name, 'src_port_nr': None,
+                      'src_port_name': sap_name,
+                      'dst_port_id': self.switch.ports[sap_intf], 'dst_port_nr': self.switch.ports[sap_intf],
+                      'dst_port_name': sap_intf.name}
+        self.net.DCNetwork_graph.add_edge(sap_name, self.switch.name, attr_dict=attr_dict2)
+
+        attr_dict2 = {'dst_port_id': sap_name, 'dst_port_nr': None,
+                      'dst_port_name': sap_name,
+                      'src_port_id': self.switch.ports[sap_intf], 'src_port_nr': self.switch.ports[sap_intf],
+                      'src_port_name': sap_intf.name}
+        self.net.DCNetwork_graph.add_edge(self.switch.name, sap_name, attr_dict=attr_dict2)
+
+
     def listCompute(self):
         """
         Return a list of all running containers assigned to this