diff --git a/Dockerfile_py3 b/Dockerfile_py3 new file mode 100644 index 00000000..a44b1548 --- /dev/null +++ b/Dockerfile_py3 @@ -0,0 +1,106 @@ +# Copyright (c) 2017 SONATA-NFV and Paderborn University +# 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, Paderborn University +# 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). + +FROM ubuntu:xenial + +ENV SON_EMU_IN_DOCKER 1 +ENV PIP_DEFAULT_TIMEOUT=100 + +# install required packages +RUN apt-get clean +RUN apt-get update \ + && apt-get install -y git \ + net-tools \ + aptitude \ + apt-utils \ + build-essential \ + libevent-dev \ + software-properties-common \ + ansible \ + curl \ + iptables \ + iputils-ping \ + sudo \ + vim \ + nano \ + wget + +RUN add-apt-repository ppa:jonathonf/python-3.6 +RUN apt-get update +RUN apt install -y python3.6 +RUN apt install -y python3.6-dev +RUN apt install -y python3.6-venv +RUN wget https://bootstrap.pypa.io/get-pip.py +RUN python3.6 get-pip.py +RUN ln -s /usr/bin/python3.6 /usr/local/bin/python3 + +# install containernet (using its Ansible playbook) +#RUN git clone https://github.com/containernet/containernet.git && \ +# (cd containernet && git checkout 6fcee82e192c8c0e6447650d6f512842185529ee) +RUN git clone https://github.com/RafaelSche/containernet.git +WORKDIR /containernet/ansible +RUN ansible-playbook -i "localhost," -c local --skip-tags "notindocker" install_py3.yml + +# install emulator (using its Ansible playbook) +COPY . /son-emu +WORKDIR /son-emu/ansible +RUN ansible-playbook -i "localhost," -c local --skip-tags "notindocker" install_py3.yml +WORKDIR /son-emu +RUN python3 setup.py develop + +# Hotfix: https://github.com/pytest-dev/pytest/issues/4770 +RUN pip3 install "more-itertools<=5.0.0" + +# Hotfix: Do not use latest tinyrpc lib, since it breaks Ryu +RUN pip3 install "tinyrpc==1.0.3" + +RUN pip3 install wheel --upgrade + +# Important: This entrypoint is required to start the OVS service +ENTRYPOINT ["/son-emu/utils/docker/entrypoint.sh"] +CMD ["python3", "examples/default_single_dc_topology.py"] + +# open ports for emulator APIs +# SONATA GK +EXPOSE 5000 +# EMU REST API +EXPOSE 5001 +# Monitoring (Prometheus) +EXPOSE 8081 +# Monitoring (GW) +EXPOSE 9091 +# OpenStack-fake +EXPOSE 4000 +# OpenStack-fake +EXPOSE 10243 +# OpenStack-fake +EXPOSE 9005 +# OpenStack-fake (Keystone) +EXPOSE 6001 +# OpenStack-fake +EXPOSE 9775 +# OpenStack-fake +EXPOSE 10697 diff --git a/ansible/install.yml b/ansible/install.yml index e303aad8..ee5d2c0e 100755 --- a/ansible/install.yml +++ b/ansible/install.yml @@ -41,62 +41,68 @@ - name: install pip apt: pkg=python-pip state=installed + - name: install libevent-dev + apt: pkg=libevent-dev state=installed + + - name: install libevent-dev + apt: pkg=python-all-dev state=installed + + - name: find pip executable + shell: "which pip" + register: pip_path + - name: install setuptools - pip: name=setuptools state=latest + pip: name=setuptools state=latest executable={{pip_path.stdout}} - name: install tabulate - pip: name=tabulate state=latest + pip: name=tabulate state=latest executable={{pip_path.stdout}} - name: install argparse - pip: name=argparse state=latest + pip: name=argparse state=latest executable={{pip_path.stdout}} - name: install networkx - pip: name=networkx version=1.11 + pip: name=networkx version=1.11 executable={{pip_path.stdout}} - name: install six - pip: name=six state=latest + pip: name=six state=latest executable={{pip_path.stdout}} - name: install tinyrpc (fixed version to not break ryu) - pip: name=tinyrpc version=1.0.3 + pip: name=tinyrpc version=1.0.3 executable={{pip_path.stdout}} - name: install ryu - pip: name=ryu state=latest + pip: name=ryu state=latest executable={{pip_path.stdout}} - name: install oslo.config - pip: name=oslo.config state=latest + pip: name=oslo.config state=latest executable={{pip_path.stdout}} - name: install pytest - pip: name=pytest version=4.6.4 + pip: name=pytest version=4.6.4 executable={{pip_path.stdout}} - name: install Flask - pip: name=Flask state=latest + pip: name=Flask executable={{pip_path.stdout}} - name: install flask_restful - pip: name=flask_restful state=latest + pip: name=flask_restful state=latest executable={{pip_path.stdout}} - name: install requests - pip: name=requests state=latest + pip: name=requests state=latest executable={{pip_path.stdout}} - name: install docker - pip: name=docker version=2.0.2 + pip: name=docker version=2.0.2 executable={{pip_path.stdout}} - name: install prometheus_client - pip: name=prometheus_client state=latest + pip: name=prometheus_client state=latest executable={{pip_path.stdout}} - name: install latest urllib3 (fix error urllib3.connection.match_hostname = match_hostname) - pip: name=urllib3 version=1.21.1 + pip: name=urllib3 version=1.21.1 executable={{pip_path.stdout}} - name: install iptc - pip: name=python-iptables state=latest + pip: name=python-iptables state=latest executable={{pip_path.stdout}} - name: install ipaddress - pip: name=ipaddress state=latest + pip: name=ipaddress state=latest executable={{pip_path.stdout}} - name: install gevent - pip: name=gevent state=latest - - #- name: install urllib - # pip: name=urllib state=latest - + pip: name=gevent executable={{pip_path.stdout}} diff --git a/ansible/install_py3.yml b/ansible/install_py3.yml new file mode 100644 index 00000000..e38f747d --- /dev/null +++ b/ansible/install_py3.yml @@ -0,0 +1,110 @@ +# Copyright (c) 2015 SONATA-NFV and Paderborn University +# 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, Paderborn University +# 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). + +- hosts: localhost + tasks: + - name: updates apt + apt: update_cache=yes + + - name: install python3-dev + apt: pkg=python3-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 pip3 + apt: pkg=python3-pip state=installed + + - name: install libevent-dev + apt: pkg=libevent-dev state=installed + + - name: install libevent-dev + apt: pkg=python-all-dev state=installed + + - name: find pip executable + shell: "which pip3" + register: pip_path + + - name: install setuptools + pip: name=setuptools state=latest executable={{pip_path.stdout}} + + - name: install tabulate + pip: name=tabulate state=latest executable={{pip_path.stdout}} + + - name: install argparse + pip: name=argparse state=latest executable={{pip_path.stdout}} + + - name: install networkx + pip: name=networkx version=1.11 executable={{pip_path.stdout}} + + - name: install six + pip: name=six state=latest executable={{pip_path.stdout}} + + - name: install tinyrpc (fixed version to not break ryu) + pip: name=tinyrpc version=1.0.3 executable={{pip_path.stdout}} + + - name: install ryu + pip: name=ryu state=latest executable={{pip_path.stdout}} + + - name: install oslo.config + pip: name=oslo.config state=latest executable={{pip_path.stdout}} + + - name: install pytest + pip: name=pytest version=4.6.4 executable={{pip_path.stdout}} + + - name: install Flask + pip: name=Flask executable={{pip_path.stdout}} + + - name: install flask_restful + pip: name=flask_restful state=latest executable={{pip_path.stdout}} + + - name: install requests + pip: name=requests state=latest executable={{pip_path.stdout}} + + - name: install docker + pip: name=docker version=2.0.2 executable={{pip_path.stdout}} + + - name: install prometheus_client + pip: name=prometheus_client state=latest executable={{pip_path.stdout}} + + - name: install latest urllib3 (fix error urllib3.connection.match_hostname = match_hostname) + pip: name=urllib3 version=1.21.1 executable={{pip_path.stdout}} + + - name: install iptc + pip: name=python-iptables state=latest executable={{pip_path.stdout}} + + - name: install ipaddress + pip: name=ipaddress state=latest executable={{pip_path.stdout}} + + - name: install gevent + pip: name=gevent executable={{pip_path.stdout}} + + + + diff --git a/src/emuvim/api/openstack/chain_api.py b/src/emuvim/api/openstack/chain_api.py index 21cb65be..7f38a7ec 100755 --- a/src/emuvim/api/openstack/chain_api.py +++ b/src/emuvim/api/openstack/chain_api.py @@ -513,7 +513,7 @@ def _findNames(self, src_dc, src_stack, src_vnf, src_intfs, # search for related OpenStackAPIs api_src = None api_dst = None - from openstack_api_endpoint import OpenstackApiEndpoint + from emuvim.api.openstack.openstack_api_endpoint import OpenstackApiEndpoint for api in OpenstackApiEndpoint.dc_apis: if api.compute.dc == dc_src: api_src = api @@ -711,7 +711,7 @@ def _findName(self, dc, stack, vnf, port): dc_real = self.api.manage.net.dcs[dc] # search for related OpenStackAPIs api_real = None - from openstack_api_endpoint import OpenstackApiEndpoint + from emuvim.api.openstack.openstack_api_endpoint import OpenstackApiEndpoint for api in OpenstackApiEndpoint.dc_apis: if api.compute.dc == dc_real: api_real = api diff --git a/src/emuvim/api/openstack/compute.py b/src/emuvim/api/openstack/compute.py index 9d77a441..49993315 100755 --- a/src/emuvim/api/openstack/compute.py +++ b/src/emuvim/api/openstack/compute.py @@ -25,22 +25,22 @@ # partner consortium (www.sonata-nfv.eu). from mininet.link import Link -from resources.instance_flavor import InstanceFlavor -from resources.net import Net -from resources.port import Port -from resources.port_pair import PortPair -from resources.port_pair_group import PortPairGroup -from resources.flow_classifier import FlowClassifier -from resources.port_chain import PortChain -from resources.server import Server -from resources.image import Image +from emuvim.api.openstack.resources.instance_flavor import InstanceFlavor +from emuvim.api.openstack.resources.net import Net +from emuvim.api.openstack.resources.port import Port +from emuvim.api.openstack.resources.port_pair import PortPair +from emuvim.api.openstack.resources.port_pair_group import PortPairGroup +from emuvim.api.openstack.resources.flow_classifier import FlowClassifier +from emuvim.api.openstack.resources.port_chain import PortChain +from emuvim.api.openstack.resources.server import Server +from emuvim.api.openstack.resources.image import Image from docker import DockerClient import logging import threading import uuid import time -import ip_handler as IP +import emuvim.api.openstack.ip_handler as IP import hashlib @@ -232,8 +232,12 @@ def delete_stack(self, stack_id): for server in self.stacks[stack_id].servers.values(): self.stop_compute(server) self.delete_server(server) - for net in self.stacks[stack_id].nets.values(): - self.delete_network(net.id) + stack = list(self.stacks[stack_id].nets.values()) + while stack: + id = stack.pop().id + self.delete_network(id) + # for net in self.stacks[stack_id].nets.values(): + # self.delete_network(net.id) for port in self.stacks[stack_id].ports.values(): self.delete_port(port.id) @@ -592,7 +596,7 @@ def _shorten_server_name(self, name, char_limit=9): """ if len(name) > char_limit: # construct a short name - h = hashlib.sha224(name).hexdigest() + h = hashlib.sha224(name.encode()).hexdigest() h = h[0:char_limit] LOG.debug("Shortened server name '%s' to '%s'" % (name, h)) return name @@ -630,6 +634,7 @@ def find_network_by_name_or_id(self, name_or_id): """ if name_or_id in self.nets: return self.nets[name_or_id] + print("name_or_id: ", name_or_id) for net in self.nets.values(): if net.name == name_or_id: return net @@ -710,10 +715,10 @@ def find_port_by_name_or_id(self, name_or_id): if name_or_id in self.ports: return self.ports[name_or_id] # find by name - matching_ports = filter( + matching_ports = list(filter( lambda port: port.name == name_or_id or port.template_name == name_or_id, self.ports.values() - ) + )) matching_ports_count = len(matching_ports) if matching_ports_count == 1: return matching_ports[0] diff --git a/src/emuvim/api/openstack/heat_parser.py b/src/emuvim/api/openstack/heat_parser.py index ffcaa0a8..8923d72e 100755 --- a/src/emuvim/api/openstack/heat_parser.py +++ b/src/emuvim/api/openstack/heat_parser.py @@ -23,14 +23,15 @@ # 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). -from __future__ import print_function # TODO remove when print is no longer needed for debugging -from resources.router import Router +# TODO remove when print is no longer needed for debugging +from __future__ import print_function +from emuvim.api.openstack.resources.router import Router from datetime import datetime import re import sys import uuid import logging -import ip_handler as IP +import emuvim.api.openstack.ip_handler as IP LOG = logging.getLogger("api.openstack.heat.parser") @@ -130,7 +131,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): net_name, True) except Exception as e: - LOG.warning('Could not create Net: ' + e.message) + LOG.warning('Could not create Net: ' + str(e)) return if 'OS::Neutron::Subnet' in resource['type'] and "Net" not in resource['type']: @@ -151,7 +152,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): if not stack_update: net.set_cidr(IP.get_new_cidr(net.subnet_id)) except Exception as e: - LOG.warning('Could not create Subnet: ' + e.message) + LOG.warning('Could not create Subnet: ' + str(e)) return if 'OS::Neutron::Port' in resource['type']: @@ -172,7 +173,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): port.ip_address = net.get_new_ip_address(port.name) return except Exception as e: - LOG.warning('Could not create Port: ' + e.message) + LOG.warning('Could not create Port: ' + str(e)) self.bufferResource.append(resource) return @@ -210,7 +211,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): server.port_names.append(port_name) return except Exception as e: - LOG.warning('Could not create Server: ' + e.message) + LOG.warning('Could not create Server: ' + str(e)) return if 'OS::Neutron::RouterInterface' in resource['type']: @@ -246,7 +247,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): stack.ports[port_name].floating_ip = floating_network_id except Exception as e: - LOG.warning('Could not create FloatingIP: ' + e.message) + LOG.warning('Could not create FloatingIP: ' + str(e)) return if 'OS::Neutron::Router' in resource['type']: @@ -255,7 +256,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): if name not in stack.routers: stack.routers[name] = Router(name) except Exception as e: - print('Could not create Router: ' + e.message) + print('Could not create Router: ' + str(e)) return if 'OS::Heat::ResourceGroup' in resource['type']: @@ -267,7 +268,7 @@ def handle_resource(self, resource, stack, dc_label, stack_update=False): self.handle_resource( embedded_resource, stack, dc_label, stack_update) except Exception as e: - print('Could not create Router: ' + e.message) + print('Could not create Router: ' + str(e)) return LOG.warning( diff --git a/src/emuvim/api/openstack/helper.py b/src/emuvim/api/openstack/helper.py index c7ef69bf..5f9d5730 100644 --- a/src/emuvim/api/openstack/helper.py +++ b/src/emuvim/api/openstack/helper.py @@ -23,7 +23,10 @@ # 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). -from urlparse import urlparse +try: + from urllib.parse import urlparse +except ImportError: + from urlparse import urlparse import logging LOG = logging.getLogger("api.openstack.helper") diff --git a/src/emuvim/api/openstack/ip_handler.py b/src/emuvim/api/openstack/ip_handler.py index 91383428..070f9921 100755 --- a/src/emuvim/api/openstack/ip_handler.py +++ b/src/emuvim/api/openstack/ip_handler.py @@ -23,7 +23,7 @@ # 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). -from resources.net import Net +from emuvim.api.openstack.resources.net import Net import threading lock = threading.Lock() diff --git a/src/emuvim/api/openstack/manage.py b/src/emuvim/api/openstack/manage.py index a78cb30a..1c5c5a51 100755 --- a/src/emuvim/api/openstack/manage.py +++ b/src/emuvim/api/openstack/manage.py @@ -27,7 +27,7 @@ import threading import uuid import networkx as nx -import chain_api +import emuvim.api.openstack.chain_api as chain_api import json import random from emuvim.api.openstack.resources.net import Net @@ -132,7 +132,7 @@ def init_floating_network(self, name="default"): port.ip_address = root_ip # floating ip network setup # wierd way of getting a datacenter object - first_dc = self.net.dcs.values()[0] + first_dc = list(self.net.dcs.values())[0] # set a dpid for the switch. for this we have to get the id of the # next possible dc self.floating_switch = self.net.addSwitch( diff --git a/src/emuvim/api/openstack/openstack_api_endpoint.py b/src/emuvim/api/openstack/openstack_api_endpoint.py index fdfa5e42..34d99068 100755 --- a/src/emuvim/api/openstack/openstack_api_endpoint.py +++ b/src/emuvim/api/openstack/openstack_api_endpoint.py @@ -23,16 +23,21 @@ # 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). -from manage import OpenstackManage +from emuvim.api.openstack.manage import OpenstackManage -from openstack_dummies.glance_dummy_api import GlanceDummyApi -from openstack_dummies.heat_dummy_api import HeatDummyApi -from openstack_dummies.keystone_dummy_api import KeystoneDummyApi -from openstack_dummies.neutron_dummy_api import NeutronDummyApi -from openstack_dummies.nova_dummy_api import NovaDummyApi +from emuvim.api.openstack.openstack_dummies.glance_dummy_api import \ + GlanceDummyApi +from emuvim.api.openstack.openstack_dummies.heat_dummy_api import \ + HeatDummyApi +from emuvim.api.openstack.openstack_dummies.keystone_dummy_api import \ + KeystoneDummyApi +from emuvim.api.openstack.openstack_dummies.neutron_dummy_api import \ + NeutronDummyApi +from emuvim.api.openstack.openstack_dummies.nova_dummy_api import \ + NovaDummyApi import logging -import compute +import emuvim.api.openstack.compute as compute import socket import time diff --git a/src/emuvim/api/openstack/openstack_dummies/glance_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/glance_dummy_api.py index 1b066f05..8d85974e 100755 --- a/src/emuvim/api/openstack/openstack_dummies/glance_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/glance_dummy_api.py @@ -137,7 +137,7 @@ def get(self): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of images." % __name__) - return ex.message, 500 + return str(ex), 500 def post(self): """ @@ -226,7 +226,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve image with id %s." % (__name__, id)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') def put(self, id): @@ -259,5 +259,5 @@ def get(self, owner, container): except Exception as ex: logging.exception( u"%s: Could not retrieve image with id %s." % (__name__, id)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') diff --git a/src/emuvim/api/openstack/openstack_dummies/heat_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/heat_dummy_api.py index 86fb6c16..9cd4d5d8 100755 --- a/src/emuvim/api/openstack/openstack_dummies/heat_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/heat_dummy_api.py @@ -116,7 +116,7 @@ def post(self, tenant_id): reader = HeatParser(self.api.compute) if isinstance(stack_dict['template'], str) or isinstance( - stack_dict['template'], unicode): + stack_dict['template'], bytes): stack_dict['template'] = json.loads(stack_dict['template']) if not reader.parse_input( stack_dict['template'], stack, self.api.compute.dc.label): @@ -142,7 +142,7 @@ def post(self, tenant_id): except Exception as ex: LOG.exception("Heat: Create Stack exception.") - return ex.message, 500 + return str(ex), 500 def get(self, tenant_id): """ @@ -174,7 +174,7 @@ def get(self, tenant_id): status=200, mimetype="application/json") except Exception as ex: LOG.exception("Heat: List Stack exception.") - return ex.message, 500 + return str(ex), 500 class HeatShowStack(Resource): @@ -244,7 +244,7 @@ def get(self, tenant_id, stack_name_or_id, stack_id=None): except Exception as ex: LOG.exception("Heat: Show stack exception.") - return ex.message, 500 + return str(ex), 500 class HeatShowStackTemplate(Resource): @@ -278,7 +278,7 @@ def get(self, tenant_id, stack_name_or_id, stack_id=None): except Exception as ex: LOG.exception("Heat: Show stack template exception.") - return ex.message, 500 + return str(ex), 500 class HeatShowStackResources(Resource): @@ -313,7 +313,7 @@ def get(self, tenant_id, stack_name_or_id, stack_id=None): except Exception as ex: LOG.exception("Heat: Show stack template exception.") - return ex.message, 500 + return str(ex), 500 class HeatUpdateStack(Resource): @@ -362,7 +362,7 @@ def update_stack(self, tenant_id, stack_name_or_id, stack_id=None): reader = HeatParser(self.api.compute) if isinstance(stack_dict['template'], str) or isinstance( - stack_dict['template'], unicode): + stack_dict['template'], bytes): stack_dict['template'] = json.loads(stack_dict['template']) if not reader.parse_input( stack_dict['template'], stack, self.api.compute.dc.label, stack_update=True): @@ -376,7 +376,7 @@ def update_stack(self, tenant_id, stack_name_or_id, stack_id=None): except Exception as ex: LOG.exception("Heat: Update Stack exception") - return ex.message, 500 + return str(ex), 500 class HeatDeleteStack(Resource): @@ -408,4 +408,4 @@ def delete(self, tenant_id, stack_name_or_id, stack_id=None): except Exception as ex: LOG.exception("Heat: Delete Stack exception") - return ex.message, 500 + return str(ex), 500 diff --git a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py index 0741553a..0054ddbc 100755 --- a/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/keystone_dummy_api.py @@ -323,7 +323,7 @@ def post(self): except Exception as ex: logging.exception("Keystone: Get token failed.") - return ex.message, 500 + return str(ex), 500 class KeystoneGetTokenv3(Resource): @@ -454,4 +454,4 @@ def post(self): except Exception as ex: logging.exception("Keystone: Get token failed.") - return ex.message, 500 + return str(ex), 500 diff --git a/src/emuvim/api/openstack/openstack_dummies/neutron_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/neutron_dummy_api.py index e017660d..2f11d9f9 100755 --- a/src/emuvim/api/openstack/openstack_dummies/neutron_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/neutron_dummy_api.py @@ -25,9 +25,10 @@ # partner consortium (www.sonata-nfv.eu). from flask_restful import Resource from flask import request, Response -from emuvim.api.openstack.openstack_dummies.base_openstack_dummy import BaseOpenstackDummy +from emuvim.api.openstack.openstack_dummies.base_openstack_dummy import \ + BaseOpenstackDummy from datetime import datetime -import neutron_sfc_dummy_api as SFC +import emuvim.api.openstack.openstack_dummies.neutron_sfc_dummy_api as SFC import logging import json import uuid @@ -269,7 +270,7 @@ def get(self): except Exception as ex: LOG.exception("Neutron: List networks exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -319,7 +320,7 @@ def get_network(self, network_name_or_id, as_list): except Exception as ex: logging.exception("Neutron: Show network exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -350,7 +351,7 @@ def post(self): {"network": net.create_network_dict()}), status=201, mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Create network excepiton.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -397,7 +398,7 @@ def put(self, network_id): # TODO currently only the name will be changed except Exception as ex: LOG.exception("Neutron: Show networks exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -434,7 +435,7 @@ def delete(self, network_id): return Response('', status=204, mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Delete network exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -481,7 +482,7 @@ def get(self): except Exception as ex: LOG.exception("Neutron: List subnets exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -529,7 +530,7 @@ def get_subnet(self, subnet_name_or_id, as_list): except Exception as ex: LOG.exception("Neutron: Show subnet exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -589,7 +590,7 @@ def post(self): except Exception as ex: LOG.exception("Neutron: Create network excepiton.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -643,7 +644,7 @@ def put(self, subnet_id): except Exception as ex: LOG.exception("Neutron: Show networks exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -691,7 +692,7 @@ def delete(self, subnet_id): status=404, mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Delete subnet exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -739,14 +740,14 @@ def get(self): ), ports) port_dict = dict() - port_dict["ports"] = map(lambda x: x.create_port_dict(self.api.compute), ports) + port_dict["ports"] = list(map(lambda x: x.create_port_dict(self.api.compute), ports)) return Response(json.dumps(port_dict), status=200, mimetype='application/json') except Exception as ex: LOG.exception("Neutron: List ports exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -792,7 +793,7 @@ def get_port(self, port_name_or_id, as_list): mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Show port exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -856,7 +857,7 @@ def post(self): mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Show port exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -920,7 +921,7 @@ def put(self, port_id): mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Update port exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -967,7 +968,7 @@ def delete(self, port_id): except Exception as ex: LOG.exception("Neutron: Delete port exception.") - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -1048,5 +1049,5 @@ def post(self): mimetype='application/json') except Exception as ex: LOG.exception("Neutron: Create FloatingIP exception %s.", ex) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') diff --git a/src/emuvim/api/openstack/openstack_dummies/neutron_sfc_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/neutron_sfc_dummy_api.py index dbfb4b52..e611a872 100644 --- a/src/emuvim/api/openstack/openstack_dummies/neutron_sfc_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/neutron_sfc_dummy_api.py @@ -67,7 +67,7 @@ def post(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -91,7 +91,7 @@ def put(self, pair_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -106,7 +106,7 @@ def delete(self, pair_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -118,14 +118,14 @@ def get(self): id = request.args.get('id') if id and any(id): port_pairs = filter(lambda port_pair: port_pair.id == id, port_pairs) - resp = {"port_pairs": map(lambda port_pair: port_pair.create_dict(self.api.compute), port_pairs)} + resp = {"port_pairs": list(map(lambda port_pair: port_pair.create_dict(self.api.compute), port_pairs))} return Response(json.dumps(resp), status=200, mimetype='application/json') except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -143,7 +143,7 @@ def get(self, pair_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -175,7 +175,7 @@ def post(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -202,7 +202,7 @@ def put(self, group_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -217,7 +217,7 @@ def delete(self, group_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -236,7 +236,7 @@ def get(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -255,7 +255,7 @@ def get(self, group_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -307,7 +307,7 @@ def post(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -332,7 +332,7 @@ def put(self, flow_classifier_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -347,7 +347,7 @@ def delete(self, flow_classifier_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -366,7 +366,7 @@ def get(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -385,7 +385,7 @@ def get(self, flow_classifier_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -420,7 +420,7 @@ def post(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -453,7 +453,7 @@ def put(self, chain_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -468,7 +468,7 @@ def delete(self, chain_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -487,7 +487,7 @@ def get(self): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') @@ -506,5 +506,5 @@ def get(self, chain_id): except Exception as ex: logging.exception("Neutron SFC: %s Exception." % str(self.__class__.__name__)) - return Response(ex.message, status=500, + return Response(str(ex), status=500, mimetype='application/json') diff --git a/src/emuvim/api/openstack/openstack_dummies/nova_dummy_api.py b/src/emuvim/api/openstack/openstack_dummies/nova_dummy_api.py index 12a9cc2b..b57b83c6 100755 --- a/src/emuvim/api/openstack/openstack_dummies/nova_dummy_api.py +++ b/src/emuvim/api/openstack/openstack_dummies/nova_dummy_api.py @@ -116,7 +116,7 @@ def get(self): except Exception as ex: LOG.exception(u"%s: Could not show list of versions." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaVersionShow(Resource): @@ -170,7 +170,7 @@ def get(self, id): except Exception as ex: LOG.exception(u"%s: Could not show list of versions." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListServersApi(Resource): @@ -208,7 +208,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of servers." % __name__) - return ex.message, 500 + return str(ex), 500 def post(self, id): """ @@ -262,7 +262,7 @@ def post(self, id): except Exception as ex: LOG.exception(u"%s: Could not create the server." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListServersAndPortsApi(Resource): @@ -311,7 +311,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of servers." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListServersDetailed(Resource): @@ -375,7 +375,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of servers." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListFlavors(Resource): @@ -413,7 +413,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of servers." % __name__) - return ex.message, 500 + return str(ex), 500 def post(self, id): LOG.debug("API CALL: %s POST" % str(self.__class__.__name__)) @@ -480,7 +480,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of servers." % __name__) - return ex.message, 500 + return str(ex), 500 def post(self, id): LOG.debug("API CALL: %s POST" % str(self.__class__.__name__)) @@ -542,7 +542,7 @@ def get(self, id, flavorid): except Exception as ex: LOG.exception(u"%s: Could not retrieve flavor with id %s" % (__name__, flavorid)) - return ex.message, 500 + return str(ex), 500 def delete(self, id, flavorid): """ @@ -587,7 +587,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of images." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListImagesDetails(Resource): @@ -633,7 +633,7 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of images." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaListImageById(Resource): @@ -671,7 +671,7 @@ def get(self, id, imageid): except Exception as ex: LOG.exception(u"%s: Could not retrieve image with id %s." % (__name__, imageid)) - return ex.message, 500 + return str(ex), 500 def delete(self, id, imageid): """ @@ -744,7 +744,7 @@ def get(self, id, serverid): except Exception as ex: LOG.exception( u"%s: Could not retrieve the server details." % __name__) - return ex.message, 500 + return str(ex), 500 def delete(self, id, serverid): """ @@ -772,7 +772,7 @@ def delete(self, id, serverid): except Exception as ex: LOG.exception(u"%s: Could not create the server." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaInterfaceToServer(Resource): @@ -863,7 +863,7 @@ def post(self, id, serverid): except Exception as ex: LOG.exception( u"%s: Could not add interface to the server." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaShowAndDeleteInterfaceAtServer(Resource): @@ -908,7 +908,7 @@ def delete(self, id, serverid, port_id): except Exception as ex: LOG.exception( u"%s: Could not detach interface from the server." % __name__) - return ex.message, 500 + return str(ex), 500 class NovaLimits(Resource): @@ -963,4 +963,4 @@ def get(self, id): except Exception as ex: LOG.exception( u"%s: Could not retrieve the list of images." % __name__) - return ex.message, 500 + return str(ex), 500 diff --git a/src/emuvim/api/openstack/resources/net.py b/src/emuvim/api/openstack/resources/net.py index 112cca6d..42af151c 100755 --- a/src/emuvim/api/openstack/resources/net.py +++ b/src/emuvim/api/openstack/resources/net.py @@ -24,6 +24,7 @@ # acknowledge the contributions of their colleagues of the SONATA # partner consortium (www.sonata-nfv.eu). import re +from json import dumps class Net: @@ -243,7 +244,7 @@ def ip_2_int(ip): :return: IP address as int. :rtype: ``int`` """ - o = map(int, ip.split('.')) + o = list(map(int, ip.split('.'))) res = (16777216 * o[0]) + (65536 * o[1]) + (256 * o[2]) + o[3] return res @@ -340,4 +341,4 @@ def __hash__(self): self.gateway_ip, self.segmentation_id, self._cidr, - self.start_end_dict)) + dumps(self.start_end_dict))) diff --git a/src/emuvim/api/openstack/resources/port_chain.py b/src/emuvim/api/openstack/resources/port_chain.py index e1b3cbc5..c061a1ee 100644 --- a/src/emuvim/api/openstack/resources/port_chain.py +++ b/src/emuvim/api/openstack/resources/port_chain.py @@ -63,8 +63,8 @@ def install(self, compute): port_pair_chain = map(lambda port_pair_group_id: self._get_port_pair(port_pair_group_id, compute), self.port_pair_groups) - ingress_ports = map(lambda port_pair: port_pair.ingress, port_pair_chain) - egress_ports = map(lambda port_pair: port_pair.ingress, port_pair_chain) + ingress_ports = list(map(lambda port_pair: port_pair.ingress, port_pair_chain)) + egress_ports = list(map(lambda port_pair: port_pair.ingress, port_pair_chain)) chain_start = ingress_ports[0] chain_rest = ingress_ports[1:] @@ -75,7 +75,7 @@ def install(self, compute): port = compute.find_port_by_name_or_id(flow_classifier.logical_source_port) - chain = [(port, chain_start)] + zip(egress_ports, chain_rest) + chain = [(port, chain_start)] + list(zip(egress_ports, chain_rest)) for (egress_port, ingress_port) in chain: server_egress = None diff --git a/src/emuvim/api/rest/compute.py b/src/emuvim/api/rest/compute.py index 62a8f18e..baa1830e 100755 --- a/src/emuvim/api/rest/compute.py +++ b/src/emuvim/api/rest/compute.py @@ -97,7 +97,9 @@ def put(self, dc_label, compute_name, resource=None, value=None): c.start() except Exception as ex: logging.warning("Couldn't run Docker entry point VIM_EMU_CMD") - logging.exception("Exception:") + logging.exception( + "Exception: " + str(ex) + "; " + str(type(ex)) + ) # return docker inspect dict return c.getStatus(), 200, CORS_HEADER except Exception as ex: @@ -153,7 +155,7 @@ def get(self, dc_label=None): if dc_label is None or dc_label == 'None': # return list with all compute nodes in all DCs all_containers = [] - for dc in dcs.itervalues(): + for dc in dcs.values(): all_containers += dc.listCompute() container_list = [(c.name, c.getStatus()) for c in all_containers] @@ -246,7 +248,7 @@ class DatacenterList(Resource): def get(self): logging.debug("API CALL: datacenter list") try: - return [d.getStatus() for d in dcs.itervalues()], 200, CORS_HEADER + return [d.getStatus() for d in dcs.values()], 200, CORS_HEADER except Exception as ex: logging.exception("API error.") return ex.message, 500, CORS_HEADER diff --git a/src/emuvim/api/rest/network.py b/src/emuvim/api/rest/network.py index e8c6b9a8..a16a84a0 100755 --- a/src/emuvim/api/rest/network.py +++ b/src/emuvim/api/rest/network.py @@ -115,7 +115,7 @@ def _NetworkAction(self, command=None): return str(c), 200, CORS_HEADER except Exception as ex: logging.exception("API error.") - return ex.message, 500, CORS_HEADER + return str(ex), 500, CORS_HEADER class DrawD3jsgraph(Resource): diff --git a/src/emuvim/api/rest/rest_api_endpoint.py b/src/emuvim/api/rest/rest_api_endpoint.py index d2abde85..c5154cb2 100755 --- a/src/emuvim/api/rest/rest_api_endpoint.py +++ b/src/emuvim/api/rest/rest_api_endpoint.py @@ -31,15 +31,15 @@ from gevent.pywsgi import WSGIServer # need to import total module to set its global variable dcs -import compute -from compute import ComputeList, Compute, ComputeResources, DatacenterList, DatacenterStatus +from emuvim.api.rest import compute +from emuvim.api.rest.compute import ComputeList, Compute, ComputeResources, DatacenterList, DatacenterStatus # need to import total module to set its global variable net -import network -from network import NetworkAction, DrawD3jsgraph +from emuvim.api.rest import network +from emuvim.api.rest.network import NetworkAction, DrawD3jsgraph -import monitor -from monitor import MonitorInterfaceAction, MonitorFlowAction, MonitorLinkAction, MonitorSkewAction, MonitorTerminal +from emuvim.api.rest import monitor +from emuvim.api.rest.monitor import MonitorInterfaceAction, MonitorFlowAction, MonitorLinkAction, MonitorSkewAction, MonitorTerminal import pkg_resources from os import path diff --git a/src/emuvim/api/sonata/dummygatekeeper.py b/src/emuvim/api/sonata/dummygatekeeper.py index ea9a76ea..f9af3b62 100755 --- a/src/emuvim/api/sonata/dummygatekeeper.py +++ b/src/emuvim/api/sonata/dummygatekeeper.py @@ -87,7 +87,7 @@ def generate_subnets(prefix, base, subnet_size=50, mask=24): r = list() for net in range(base, base + subnet_size): subnet = "{0}.{1}.0/{2}".format(prefix, net, mask) - r.append(ipaddress.ip_network(unicode(subnet))) + r.append(ipaddress.ip_network(subnet)) return r diff --git a/src/emuvim/api/tango/__init__.py b/src/emuvim/api/tango/__init__.py index e96aa190..0a1f6ae0 100755 --- a/src/emuvim/api/tango/__init__.py +++ b/src/emuvim/api/tango/__init__.py @@ -31,7 +31,7 @@ # partner consortium (www.5gtango.eu). import logging import threading -import llcm +from emuvim.api.tango import llcm LOG = logging.getLogger("5gtango.llcm") diff --git a/src/emuvim/api/tango/llcm.py b/src/emuvim/api/tango/llcm.py index bd3e1f94..6cbdda84 100755 --- a/src/emuvim/api/tango/llcm.py +++ b/src/emuvim/api/tango/llcm.py @@ -818,7 +818,7 @@ def _load_docker_urls(self): Get all URLs to pre-build docker images in some repo. :return: """ - for vnf_id, v in self.vnfds.iteritems(): + for vnf_id, v in list(self.vnfds.items()): for vu in v.get("virtual_deployment_units", []): vnf_container_name = get_container_name(vnf_id, vu.get("id")) if vu.get("vm_image_format") == "docker": @@ -848,7 +848,7 @@ def _build_images_from_dockerfiles(self): dc = DockerClient() LOG.info("Building %d Docker images (this may take several minutes) ..." % len( self.local_docker_files)) - for k, v in self.local_docker_files.iteritems(): + for k, v in list(self.local_docker_files.items()): for line in dc.build(path=v.replace( "Dockerfile", ""), tag=k, rm=False, nocache=False): LOG.debug("DOCKER BUILD: %s" % line) @@ -859,7 +859,7 @@ def _pull_predefined_dockerimages(self): If the package contains URLs to pre-build Docker images, we download them with this method. """ dc = DockerClient() - for url in self.remote_docker_image_urls.itervalues(): + for url in list(self.remote_docker_image_urls.values()): # only pull if not present (speedup for development) if not FORCE_PULL: if len(dc.images.list(name=url)) > 0: @@ -940,7 +940,7 @@ class FirstDcPlacement(object): """ def place(self, dcs, vnfd, vnfid, vdu, ssiid, cname): - return list(dcs.itervalues())[0] + return list(dcs.values())[0] class RoundRobinDcPlacement(object): @@ -952,7 +952,7 @@ def __init__(self): self.count = 0 def place(self, dcs, vnfd, vnfid, vdu, ssiid, cname): - dcs_list = list(dcs.itervalues()) + dcs_list = list(dcs.values()) rdc = dcs_list[self.count % len(dcs_list)] self.count += 1 # inc. count to use next DC return rdc @@ -982,14 +982,14 @@ def place(self, dcs, vnfd, vnfid, vdu, ssiid, cname): if cname not in self.static_placement: LOG.error("Coudn't find {} in placement".format(cname)) LOG.error("Using first DC as fallback!") - return list(dcs.itervalues())[0] + return list(dcs.values())[0] # lookup candidate_dc = self.static_placement.get(cname) # check if DC exsits if candidate_dc not in dcs: LOG.error("Coudn't find DC {}".format(candidate_dc)) LOG.error("Using first DC as fallback!") - return list(dcs.itervalues())[0] + return list(dcs.values())[0] # return correct DC return dcs.get(candidate_dc) @@ -1023,10 +1023,13 @@ def post(self): "error": "upload failed. file not found."}, 500 # generate a uuid to reference this package service_uuid = str(uuid.uuid4()) - file_hash = hashlib.sha1(str(son_file)).hexdigest() + file_hash = str(son_file) + file_hash = hashlib.sha1(file_hash.encode()) + file_hash = file_hash.hexdigest() # ensure that upload folder exists ensure_dir(UPLOAD_FOLDER) - upload_path = os.path.join(UPLOAD_FOLDER, "%s.tgo" % service_uuid) + upload_path = os.path.\ + join(UPLOAD_FOLDER, "%s.tgo" % service_uuid) # store *.son file to disk if is_file_object: son_file.save(upload_path) @@ -1075,7 +1078,7 @@ def get(self): """ LOG.info("GET /packages") result = list() - for suuid, sobj in GK.services.iteritems(): + for suuid, sobj in GK.services.items(): pkg = dict() pkg["pd"] = dict() pkg["uuid"] = suuid @@ -1097,7 +1100,7 @@ def get(self): """ LOG.info("GET /services") result = list() - for suuid, sobj in GK.services.iteritems(): + for suuid, sobj in GK.services.items(): service = dict() service["nsd"] = dict() service["uuid"] = suuid @@ -1126,7 +1129,7 @@ def post(self): service_name = service_uuid # first try to find by service_name if service_name is not None: - for s_uuid, s in GK.services.iteritems(): + for s_uuid, s in GK.services.items(): if s.manifest.get("name") == service_name: LOG.info("Searched for: {}. Found service w. UUID: {}" .format(service_name, s_uuid)) @@ -1136,7 +1139,7 @@ def post(self): "latest") and len(GK.services) > 0: # if we don't get a service uuid, we simple start the first service # in the list - service_uuid = list(GK.services.iterkeys())[0] + service_uuid = list(GK.services.keys())[0] if service_uuid in GK.services: # ok, we have a service uuid, lets start the service service_instance_uuid = GK.services.get( @@ -1154,10 +1157,10 @@ def get(self): """ LOG.debug("GET /instantiations or /api/v3/records/services") # return {"service_instantiations_list": [ - # list(s.instances.iterkeys()) for s in GK.services.itervalues()]} + # list(s.instances.keys()) for s in GK.services.values()]} result = list() - for suuid, sobj in GK.services.iteritems(): - for iuuid, iobj in sobj.instances.iteritems(): + for suuid, sobj in GK.services.items(): + for iuuid, iobj in sobj.instances.items(): inst = dict() inst["uuid"] = iobj.get("uuid") inst["instance_name"] = "{}-inst.{}".format( @@ -1180,7 +1183,7 @@ def delete(self): # try to be fuzzy if service_uuid_input is None: # if we don't get a service uuid we stop all services - service_uuid_list = list(GK.services.iterkeys()) + service_uuid_list = list(GK.services.keys()) LOG.info("No service_uuid given, stopping all.") else: service_uuid_list = [service_uuid_input] @@ -1188,7 +1191,7 @@ def delete(self): for service_uuid in service_uuid_list: if instance_uuid_input is None: instance_uuid_list = list( - GK.services[service_uuid].instances.iterkeys()) + GK.services[service_uuid].instances.keys()) else: instance_uuid_list = [instance_uuid_input] # for all service instances @@ -1215,7 +1218,10 @@ def generate_subnets(prefix, base, subnet_size=50, mask=24): r = list() for net in range(base, base + subnet_size): subnet = "{0}.{1}.0/{2}".format(prefix, net, mask) - r.append(ipaddress.ip_network(unicode(subnet))) + try: + r.append(ipaddress.ip_network(subnet)) + except ValueError: + r.append(ipaddress.ip_network(unicode(subnet))) return r @@ -1300,7 +1306,7 @@ def get_dc_network(): :return: """ assert (len(GK.dcs) > 0) - return GK.dcs.values()[0].net + return list(GK.dcs.values())[0].net def parse_interface(interface_name): @@ -1339,7 +1345,7 @@ def update_port_mapping_multi_instance(ssiid, port_bindings): def _offset(p): return p + MULTI_INSTANCE_PORT_OFFSET * ssiid - port_bindings = {k: _offset(v) for k, v in port_bindings.iteritems()} + port_bindings = {k: _offset(v) for k, v in port_bindings.items()} return port_bindings diff --git a/src/emuvim/dcemulator/monitoring.py b/src/emuvim/dcemulator/monitoring.py index f8280c35..34b3bab8 100755 --- a/src/emuvim/dcemulator/monitoring.py +++ b/src/emuvim/dcemulator/monitoring.py @@ -359,7 +359,7 @@ def get_flow_metrics(self): 'stats/flow', dpid=flow_dict['switch_dpid'], data=data) if isinstance(ret, dict): flow_stat_dict = ret - elif isinstance(ret, basestring): + elif isinstance(ret, str): flow_stat_dict = ast.literal_eval(ret.rstrip()) else: flow_stat_dict = None @@ -395,7 +395,7 @@ def get_network_metrics(self): ret = self.net.ryu_REST('stats/port', dpid=dpid) if isinstance(ret, dict): port_stat_dict = ret - elif isinstance(ret, basestring): + elif isinstance(ret, str): port_stat_dict = ast.literal_eval(ret.rstrip()) else: port_stat_dict = None diff --git a/src/emuvim/dcemulator/net.py b/src/emuvim/dcemulator/net.py index 8b2c445e..9e8c9be7 100755 --- a/src/emuvim/dcemulator/net.py +++ b/src/emuvim/dcemulator/net.py @@ -117,7 +117,7 @@ def __init__(self, controller=RemoteController, monitor=False, self.DCNetwork_graph = nx.MultiDiGraph() # initialize pool of vlan tags to setup the SDN paths - self.vlans = range(1, 4095)[::-1] + self.vlans = list(range(1, 4095))[::-1] # link to Ryu REST_API ryu_ip = 'localhost' @@ -159,13 +159,13 @@ def addLink(self, node1, node2, **params): assert node2 is not None # ensure type of node1 - if isinstance(node1, basestring): + if isinstance(node1, str): if node1 in self.dcs: node1 = self.dcs[node1].switch if isinstance(node1, Datacenter): node1 = node1.switch # ensure type of node2 - if isinstance(node2, basestring): + if isinstance(node2, str): if node2 in self.dcs: node2 = self.dcs[node2].switch if isinstance(node2, Datacenter): @@ -226,7 +226,7 @@ def addLink(self, node1, node2, **params): 'dst_port_name': node2_port_name} attr_dict2.update(attr_dict) self.DCNetwork_graph.add_edge( - node1.name, node2.name, attr_dict=attr_dict2) + node1.name, node2.name, **attr_dict2) attr_dict2 = {'src_port_id': node2_port_id, 'src_port_nr': node2.ports[link.intf2], 'src_port_name': node2_port_name, @@ -234,7 +234,7 @@ def addLink(self, node1, node2, **params): 'dst_port_name': node1_port_name} attr_dict2.update(attr_dict) self.DCNetwork_graph.add_edge( - node2.name, node1.name, attr_dict=attr_dict2) + node2.name, node1.name, **attr_dict2) LOG.debug("addLink: n1={0} intf1={1} -- n2={2} intf2={3}".format( str(node1), node1_port_name, str(node2), node2_port_name)) @@ -320,13 +320,13 @@ def getAllContainers(self): Returns a list with all containers within all data centers. """ all_containers = [] - for dc in self.dcs.itervalues(): + for dc in self.dcs.values(): all_containers += dc.listCompute() return all_containers def start(self): # start - for dc in self.dcs.itervalues(): + for dc in self.dcs.values(): dc.start() Containernet.start(self) @@ -629,7 +629,7 @@ def _chainAddFlow(self, vnf_src_name, vnf_dst_name, # check if port is specified (vnf:port) if vnf_src_interface is None: # take first interface by default - connected_sw = self.DCNetwork_graph.neighbors(vnf_src_name)[0] + connected_sw = list(self.DCNetwork_graph.neighbors(vnf_src_name))[0] link_dict = self.DCNetwork_graph[vnf_src_name][connected_sw] vnf_src_interface = link_dict[0]['src_port_id'] @@ -646,7 +646,7 @@ def _chainAddFlow(self, vnf_src_name, vnf_dst_name, if vnf_dst_interface is None: # take first interface by default - connected_sw = self.DCNetwork_graph.neighbors(vnf_dst_name)[0] + connected_sw = list(self.DCNetwork_graph.neighbors(vnf_dst_name))[0] link_dict = self.DCNetwork_graph[connected_sw][vnf_dst_name] vnf_dst_interface = link_dict[0]['dst_port_id'] diff --git a/src/emuvim/dcemulator/node.py b/src/emuvim/dcemulator/node.py index 87085d8a..01abb6e1 100755 --- a/src/emuvim/dcemulator/node.py +++ b/src/emuvim/dcemulator/node.py @@ -354,14 +354,14 @@ def listCompute(self): Return a list of all running containers assigned to this data center. """ - return list(self.containers.itervalues()) + return list(self.containers.values()) def listExtSAPs(self): """ Return a list of all external SAPs assigned to this data center. """ - return list(self.extSAPs.itervalues()) + return list(self.extSAPs.values()) def getStatus(self): """ diff --git a/src/emuvim/dcemulator/resourcemodel/__init__.py b/src/emuvim/dcemulator/resourcemodel/__init__.py index de100f7f..54cc69e8 100755 --- a/src/emuvim/dcemulator/resourcemodel/__init__.py +++ b/src/emuvim/dcemulator/resourcemodel/__init__.py @@ -62,7 +62,7 @@ def resource_models(self): List of registered resource models :return: """ - return list(self._resource_models.itervalues()) + return list(self._resource_models.values()) @property def num_dcs_with_rms(self): @@ -71,7 +71,7 @@ def num_dcs_with_rms(self): :return: """ return sum([len(rm.dcs) - for rm in list(self._resource_models.itervalues())]) + for rm in list(self._resource_models.values())]) class ResourceFlavor(object): diff --git a/src/emuvim/dcemulator/resourcemodel/upb/simple.py b/src/emuvim/dcemulator/resourcemodel/upb/simple.py index 01231fd6..bc81f25a 100755 --- a/src/emuvim/dcemulator/resourcemodel/upb/simple.py +++ b/src/emuvim/dcemulator/resourcemodel/upb/simple.py @@ -141,7 +141,7 @@ def _apply_limits(self): We have to recalculate for all containers to allow e.g. over provisioning models. :return: """ - for d in self._allocated_compute_instances.itervalues(): + for d in self._allocated_compute_instances.values(): if not self.deactivate_cpu_limit: self._apply_cpu_limits(d) if not self.deactivate_mem_limit: diff --git a/src/emuvim/test/unittests/test_emulator.py b/src/emuvim/test/unittests/test_emulator.py index fc06a695..ace24c1c 100755 --- a/src/emuvim/test/unittests/test_emulator.py +++ b/src/emuvim/test/unittests/test_emulator.py @@ -138,14 +138,14 @@ def testSDNChainingSingleService_withLearning(self): # check status # check get status s1 = self.dc[0].containers.get("vnf1").getStatus() - print s1 + 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 + print(s2) self.assertTrue(s2["name"] == "vnf2") self.assertTrue(s2["state"]["Running"]) self.assertTrue(s2["network"][0]['intf_name'] == 'intf2') @@ -192,14 +192,14 @@ def testSDNChainingSingleService(self): # check status # check get status s1 = self.dc[0].containers.get("vnf1").getStatus() - print s1 + 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 + print(s2) self.assertTrue(s2["name"] == "vnf2") self.assertTrue(s2["state"]["Running"]) self.assertTrue(s2["network"][0]['intf_name'] == 'intf2') diff --git a/src/emuvim/test/unittests/test_openstack.py b/src/emuvim/test/unittests/test_openstack.py index 787d398d..9eb6a6de 100755 --- a/src/emuvim/test/unittests/test_openstack.py +++ b/src/emuvim/test/unittests/test_openstack.py @@ -884,26 +884,26 @@ def testNeutronSFC(self): self.assertEqual(network_resp.status_code, 200) network_id = json.loads(network_resp.content)["networks"][0]["id"] - port_responses = map(lambda name: requests.post("http://0.0.0.0:19696/v2.0/ports", - data='{"port": {"name": "%s", "network_id": "%s"}}' % - (name, network_id), - headers=headers), - ["p1", "p2", "p3", "p4", "p5", "p6"]) + port_responses = list(map(lambda name: requests.post("http://0.0.0.0:19696/v2.0/ports", + data='{"port": {"name": "%s", "network_id": "%s"}}' % + (name, network_id), + headers=headers), + ["p1", "p2", "p3", "p4", "p5", "p6"])) for port in port_responses: self.assertEqual(port.status_code, 201) - port_ids = map(lambda response: json.loads(response.content)["port"]["id"], port_responses) + port_ids = list(map(lambda response: json.loads(response.content)["port"]["id"], port_responses)) listflavorsresponse = requests.get("http://0.0.0.0:18774/v2.1/id_bla/flavors", headers=headers) self.assertEqual(listflavorsresponse.status_code, 200) flavors = json.loads(listflavorsresponse.content)["flavors"] - m1_tiny_flavor = filter(lambda flavor: flavor["name"] == "m1.tiny", flavors)[0] + m1_tiny_flavor = list(filter(lambda flavor: flavor["name"] == "m1.tiny", flavors))[0] listimagesdetailsresponse = requests.get("http://0.0.0.0:18774/v2.1/id_bla/images/detail", headers=headers) self.assertEqual(listimagesdetailsresponse.status_code, 200) images = json.loads(listimagesdetailsresponse.content)["images"] - ubuntu_image = filter(lambda image: image["name"] == "ubuntu:trusty", images)[0] + ubuntu_image = list(filter(lambda image: image["name"] == "ubuntu:trusty", images))[0] server_url = "http://0.0.0.0:18774/v2.1/id_bla/servers" server_template = \ diff --git a/src/emuvim/test/unittests/test_resourcemodel.py b/src/emuvim/test/unittests/test_resourcemodel.py index c0cf0c45..8ce8b136 100755 --- a/src/emuvim/test/unittests/test_resourcemodel.py +++ b/src/emuvim/test/unittests/test_resourcemodel.py @@ -211,7 +211,7 @@ def testAllocationCpuLimit(self): rm.allocate(c8) # calculate allocation rm.allocate(c9) # calculate allocation except NotEnoughResourcesAvailable as e: - self.assertIn("Not enough compute", e.message) + self.assertIn("Not enough compute", str(e)) exception = True self.assertTrue(exception) @@ -241,7 +241,7 @@ def testAllocationMemLimit(self): rm.allocate(c7) # calculate allocation rm.allocate(c8) # calculate allocation except NotEnoughResourcesAvailable as e: - self.assertIn("Not enough memory", e.message) + self.assertIn("Not enough memory", str(e)) exception = True self.assertTrue(exception) diff --git a/src/emuvim/test/unittests/test_restapi.py b/src/emuvim/test/unittests/test_restapi.py index ef157e50..e63cb242 100755 --- a/src/emuvim/test/unittests/test_restapi.py +++ b/src/emuvim/test/unittests/test_restapi.py @@ -66,22 +66,24 @@ def testRestApi(self): print('->>>>>>> checking running nodes, compute list, and connectivity >>>>>>>>>>') # check number of running nodes - self.assertTrue(len(self.getContainernetContainers()) == 3) - self.assertTrue(len(self.net.hosts) == 5) - self.assertTrue(len(self.net.switches) == 2) + self.assertEqual(len(self.getContainernetContainers()), 3) + self.assertEqual(len(self.net.hosts), 5) + self.assertEqual(len(self.net.switches), 2) # check compute list result - self.assertTrue(len(self.dc[0].listCompute()) == 2) - self.assertTrue(len(self.dc[1].listCompute()) == 1) + self.assertEqual(len(self.dc[0].listCompute()), 2) + self.assertEqual(len(self.dc[1].listCompute()), 1) self.assertTrue(isinstance( self.dc[0].listCompute()[0], EmulatorCompute)) self.assertTrue(isinstance( self.dc[0].listCompute()[1], EmulatorCompute)) self.assertTrue(isinstance( self.dc[1].listCompute()[0], EmulatorCompute)) - self.assertTrue(self.dc[0].listCompute()[1].name == "vnf1") - self.assertTrue(self.dc[0].listCompute()[0].name == "vnf2") - self.assertTrue(self.dc[1].listCompute()[0].name == "vnf3") + print("dc1: ", self.dc[0].listCompute()) + print("dc2: ", self.dc[1].listCompute()) + self.assertIn("vnf1", list(map(lambda x: x.name, self.dc[0].listCompute()))) + self.assertIn("vnf2", list(map(lambda x: x.name, self.dc[0].listCompute()))) + self.assertIn("vnf3", list(map(lambda x: x.name, self.dc[1].listCompute()))) # check connectivity by using ping self.assertTrue(self.net.ping( @@ -95,15 +97,17 @@ def testRestApi(self): print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output( "vim-emu network add -src vnf1 -dst vnf2 -b -c 10", shell=True) - self.assertTrue("add-flow" in output) - self.assertTrue("success" in output) + print("output: ", output) + print("type: ", type(output)) + self.assertIn("add-flow", output.decode()) + self.assertIn("success", output.decode()) print('network remove vnf1 vnf2->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output( "vim-emu network remove -src vnf1 -dst vnf2 -b", shell=True) - self.assertTrue("del-flows" in output) - self.assertTrue("success" in output) + self.assertIn("del-flows", output.decode()) + self.assertIn("success", output.decode()) print('>>>>> checking --> vim-emu compute stop -d datacenter0 -n vnf2 ->>>>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') @@ -111,42 +115,42 @@ def testRestApi(self): "vim-emu compute stop -d datacenter0 -n vnf2", shell=True) # check number of running nodes - self.assertTrue(len(self.getContainernetContainers()) == 2) - self.assertTrue(len(self.net.hosts) == 4) - self.assertTrue(len(self.net.switches) == 2) + self.assertEqual(len(self.getContainernetContainers()), 2) + self.assertEqual(len(self.net.hosts), 4) + self.assertEqual(len(self.net.switches), 2) # check compute list result - self.assertTrue(len(self.dc[0].listCompute()) == 1) - self.assertTrue(len(self.dc[1].listCompute()) == 1) + self.assertEqual(len(self.dc[0].listCompute()), 1) + self.assertEqual(len(self.dc[1].listCompute()), 1) print('>>>>> checking --> vim-emu compute list ->>>>>>>>>>>>>>>>>>>>>>>>>>>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output("vim-emu compute list", shell=True) # check datacenter list result - self.assertTrue("datacenter0" in output) + self.assertIn("datacenter0", output.decode()) print('>>>>> checking --> vim-emu compute status -d datacenter0 -n vnf1 ->>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output( "vim-emu compute status -d datacenter0 -n vnf1", shell=True) - output = ast.literal_eval(output) + output = ast.literal_eval(output.decode()) # check compute status result - self.assertTrue(output["name"] == "vnf1") + self.assertEqual(output["name"], "vnf1") self.assertTrue(output["state"]["Running"]) print('>>>>> checking --> vim-emu datacenter list ->>>>>>>>>>>>>>>>>>>>>>>>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output("vim-emu datacenter list", shell=True) # check datacenter list result - self.assertTrue("datacenter0" in output) + self.assertIn("datacenter0", output.decode()) print('->>>>> checking --> vim-emu datacenter status -d datacenter0 ->>>>>>>>') print('->>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>') output = subprocess.check_output( "vim-emu datacenter status -d datacenter0", shell=True) # check datacenter status result - self.assertTrue("datacenter0" in output) + self.assertIn("datacenter0", output.decode()) self.stopApi() self.stopNet() diff --git a/src/emuvim/test/unittests/test_tango_llcm.py b/src/emuvim/test/unittests/test_tango_llcm.py index fc426f54..439a7417 100644 --- a/src/emuvim/test/unittests/test_tango_llcm.py +++ b/src/emuvim/test/unittests/test_tango_llcm.py @@ -37,6 +37,7 @@ from emuvim.api.tango.llcm import initialize_GK, parse_interface from ipaddress import ip_network + PACKAGE_PATH = "misc/eu.5gtango.emulator-example-service.0.1.tgo" @@ -98,7 +99,7 @@ def test_tango_llcm_start_service(self): for link in self.net.deployed_elines: vnf_src, intf_src = parse_interface( link['connection_points_reference'][0]) - print vnf_src, intf_src + print(vnf_src, intf_src) src = self.net.getNodeByName(vnf_src) if not src: continue @@ -119,10 +120,10 @@ def test_tango_llcm_start_service(self): dst_mask = [intf['netmask'] for intf in network_list if intf['intf_name'] == intf_dst][0] - print "src = {0}:{1} ip={2} ".format( - vnf_src, intf_src, src_ip, src_mask) - print "dst = {0}:{1} ip={2} ".format( - vnf_dst, intf_dst, dst_ip, dst_mask) + print("src = {0}:{1} ip={2} ".format( + vnf_src, intf_src, src_ip, src_mask)) + print("dst = {0}:{1} ip={2} ".format( + vnf_dst, intf_dst, dst_ip, dst_mask)) # check if the E-Line IP's are in the same subnet ret = ip_network(u'{0}'.format(src_ip, src_mask), strict=False)\ @@ -137,7 +138,7 @@ def test_tango_llcm_start_service(self): self.assertTrue(len(mgmt_ip) > 0) ip_address = mgmt_ip[0] ELAN_list.append(ip_address) - print ip_address + print(ip_address) # check ELAN connection by ping over the mgmt network (needs to be # configured as ELAN in the test service) @@ -147,14 +148,14 @@ def test_tango_llcm_start_service(self): for intf in network_list if intf['intf_name'] == 'mgmt'] self.assertTrue(len(mgmt_ip) > 0) ip_address = mgmt_ip[0] - print ELAN_list - print ip_address + print(ELAN_list) + print(ip_address) test_ip_list = list(ELAN_list) test_ip_list.remove(ip_address) for ip in test_ip_list: # only take ip address, without netmask p = self.net.ping([vnf], manualdestip=ip.split('/')[0]) - print p + print(p) self.assertTrue(p <= 0.0) # stop Mininet network @@ -181,7 +182,7 @@ def test_tango_llcm_stop_service(self): self.startNet() time.sleep(3) - print "starting tests" + print("starting tests") # board package files = {"package": open(PACKAGE_PATH, "rb")} r = requests.post("http://127.0.0.1:56001/packages", files=files)