support python 3 48/86748/1
authorDR695H <dr695h@att.com>
Wed, 1 May 2019 22:52:33 +0000 (18:52 -0400)
committerDR695H <dr695h@att.com>
Wed, 1 May 2019 22:53:14 +0000 (18:53 -0400)
support python 3 in all files, also support python 2 however so
everything should continue to work

Change-Id: I4ace08d2bb0623c0fdc61f2fe39d2339817aa916
Issue-ID: TEST-141
Signed-off-by: DR695H <dr695h@att.com>
19 files changed:
robotframework-onap/.gitignore
robotframework-onap/eteutils/DNSUtils.py
robotframework-onap/eteutils/EteGatherDataListener.py
robotframework-onap/eteutils/HEATUtils.py
robotframework-onap/eteutils/HTTPUtils.py
robotframework-onap/eteutils/JSONUtils.py
robotframework-onap/eteutils/OpenstackLibrary.py
robotframework-onap/eteutils/StringTemplater.py
robotframework-onap/eteutils/TemplatingEngine.py
robotframework-onap/eteutils/UUID.py
robotframework-onap/loadtest/RunEte.py
robotframework-onap/loadtest/TestMain.py
robotframework-onap/setup.cfg
robotframework-onap/setup.py
robotframework-onap/tox.ini
robotframework-onap/vcpeutils/SoUtils.py
robotframework-onap/vcpeutils/csar_parser.py
robotframework-onap/vcpeutils/preload.py
robotframework-onap/vcpeutils/vcpecommon.py

index 70a57dd..3f4c0a8 100644 (file)
@@ -1,10 +1,8 @@
-.tox/*
-python_openecomp_eteutils.egg-info/*
 
-# Created by https://www.gitignore.io/api/node,sonar,maven,eclipse,sonarqube,intellij+all
+# Created by https://www.gitignore.io/api/sonar,python,eclipse,sonarqube,pycharm+all,intellij+all
+# Edit at https://www.gitignore.io/?templates=sonar,python,eclipse,sonarqube,pycharm+all,intellij+all
 
 ### Eclipse ###
-
 .metadata
 bin/
 tmp/
@@ -141,6 +139,9 @@ fabric.properties
 # Android studio 3.1+ serialized cache file
 .idea/caches/build_file_checksums.ser
 
+# JetBrains templates
+**___jb_tmp___
+
 ### Intellij+all Patch ###
 # Ignores the whole .idea folder and all .iml files
 # See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
@@ -154,92 +155,185 @@ modules.xml
 .idea/misc.xml
 *.ipr
 
-### Maven ###
-target/
-pom.xml.tag
-pom.xml.releaseBackup
-pom.xml.versionsBackup
-pom.xml.next
-release.properties
-dependency-reduced-pom.xml
-buildNumber.properties
-.mvn/timing.properties
-.mvn/wrapper/maven-wrapper.jar
-
-### Node ###
-# Logs
-logs
-*.log
-npm-debug.log*
-yarn-debug.log*
-yarn-error.log*
+# Sonarlint plugin
+.idea/sonarlint
 
-# Runtime data
-pids
-*.pid
-*.seed
-*.pid.lock
+### PyCharm+all ###
+# Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio and WebStorm
+# Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839
 
-# Directory for instrumented libs generated by jscoverage/JSCover
-lib-cov
+# User-specific stuff
 
-# Coverage directory used by tools like istanbul
-coverage
+# Generated files
 
-# nyc test coverage
-.nyc_output
+# Sensitive or high-churn files
 
-# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
-.grunt
+# Gradle
 
-# Bower dependency directory (https://bower.io/)
-bower_components
+# Gradle and Maven with auto-import
+# When using Gradle or Maven with auto-import, you should exclude module files,
+# since they will be recreated, and may cause churn.  Uncomment if using
+# auto-import.
+# .idea/modules.xml
+# .idea/*.iml
+# .idea/modules
 
-# node-waf configuration
-.lock-wscript
+# CMake
 
-# Compiled binary addons (https://nodejs.org/api/addons.html)
-build/Release
+# Mongo Explorer plugin
 
-# Dependency directories
-node_modules/
-jspm_packages/
+# File-based project format
 
-# TypeScript v1 declaration files
-typings/
+# IntelliJ
 
-# Optional npm cache directory
-.npm
+# mpeltonen/sbt-idea plugin
 
-# Optional eslint cache
-.eslintcache
+# JIRA plugin
 
-# Optional REPL history
-.node_repl_history
+# Cursive Clojure plugin
 
-# Output of 'npm pack'
-*.tgz
+# Crashlytics plugin (for Android Studio and IntelliJ)
 
-# Yarn Integrity file
-.yarn-integrity
+# Editor-based Rest Client
+
+# Android studio 3.1+ serialized cache file
+
+# JetBrains templates
+
+### PyCharm+all Patch ###
+# Ignores the whole .idea folder and all .iml files
+# See https://github.com/joeblau/gitignore.io/issues/186 and https://github.com/joeblau/gitignore.io/issues/360
+
+
+# Reason: https://github.com/joeblau/gitignore.io/issues/186#issuecomment-249601023
 
-# dotenv environment variables file
-.env
 
-# parcel-bundler cache (https://parceljs.org/)
+# Sonarlint plugin
+
+### Python ###
+# Byte-compiled / optimized / DLL files
+__pycache__/
+*.py[cod]
+*$py.class
+
+# C extensions
+*.so
+
+# Distribution / packaging
+.Python
+build/
+develop-eggs/
+dist/
+downloads/
+eggs/
+.eggs/
+lib/
+lib64/
+parts/
+sdist/
+var/
+wheels/
+pip-wheel-metadata/
+share/python-wheels/
+*.egg-info/
+.installed.cfg
+*.egg
+MANIFEST
+
+# PyInstaller
+#  Usually these files are written by a python script from a template
+#  before PyInstaller builds the exe, so as to inject date/other infos into it.
+*.manifest
+*.spec
+
+# Installer logs
+pip-log.txt
+pip-delete-this-directory.txt
+
+# Unit test / coverage reports
+htmlcov/
+.tox/
+.nox/
+.coverage
+.coverage.*
 .cache
+nosetests.xml
+coverage.xml
+*.cover
+.hypothesis/
+.pytest_cache/
 
-# next.js build output
-.next
+# Translations
+*.mo
+*.pot
+
+# Django stuff:
+*.log
+local_settings.py
+db.sqlite3
 
-# nuxt.js build output
-.nuxt
+# Flask stuff:
+instance/
+.webassets-cache
 
-# vuepress build output
-.vuepress/dist
+# Scrapy stuff:
+.scrapy
+
+# Sphinx documentation
+docs/_build/
+
+# PyBuilder
+target/
 
-# Serverless directories
-.serverless
+# Jupyter Notebook
+.ipynb_checkpoints
+
+# IPython
+profile_default/
+ipython_config.py
+
+# pyenv
+.python-version
+
+# pipenv
+#   According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
+#   However, in case of collaboration, if having platform-specific dependencies or dependencies
+#   having no cross-platform support, pipenv may install dependencies that don’t work, or not
+#   install all needed dependencies.
+#Pipfile.lock
+
+# celery beat schedule file
+celerybeat-schedule
+
+# SageMath parsed files
+*.sage.py
+
+# Environments
+.env
+.venv
+env/
+venv/
+ENV/
+env.bak/
+venv.bak/
+
+# Spyder project settings
+.spyderproject
+.spyproject
+
+# Rope project settings
+.ropeproject
+
+# mkdocs documentation
+/site
+
+# mypy
+.mypy_cache/
+.dmypy.json
+dmypy.json
+
+# Pyre type checker
+.pyre/
 
 ### Sonar ###
 #Sonar generated dir
@@ -257,6 +351,4 @@ typings/
 # SonarLint working directories, configuration files (including credentials)
 .sonarlint/
 
-
-# End of https://www.gitignore.io/api/node,sonar,maven,eclipse,sonarqube,intellij+all
-.flattened-pom.xml
\ No newline at end of file
+# End of https://www.gitignore.io/api/sonar,python,eclipse,sonarqube,pycharm+all,intellij+all
index 65ae68b..fd0cec3 100644 (file)
@@ -7,11 +7,11 @@ class DNSUtils:
 
     def dns_request(self, domain, ns):
         """ return the ip address of the given domain name from the given nameserver """
-        request = dns.message.make_query(domain, dns.rdatatype.A);
-        request.flags |= dns.flags.AD;
+        request = dns.message.make_query(domain, dns.rdatatype.A)
+        request.flags |= dns.flags.AD
         request.find_rrset(request.additional, dns.name.root, 65535, dns.rdatatype.OPT, create=True, force_unique=True)
         response = dns.query.udp(request, ns)
 
         for answer in response.answer:
             for item in answer.items:
-                return item
\ No newline at end of file
+                return item
index 79c02b4..a99364b 100644 (file)
@@ -62,7 +62,7 @@ class EteGatherDataListener(object):
         self.folder= ''
         self.keyfile = keyfile
         self.local_gather_data_sh = shell
-        print "EteGatherDataListener instantiated"
+        print("EteGatherDataListener instantiated")
 
     def end_test(self, name, attrs):
         if attrs['status'] == 'PASS':
@@ -74,16 +74,16 @@ class EteGatherDataListener(object):
         if (self.folder != ''):
             return
         self.folder = os.path.dirname(path)
-        print(self.folder)
+        print((self.folder))
 
     def close(self):
-        print "EteGatherDataListener tests failed=" + str(self.tests_failed)
+        print("EteGatherDataListener tests failed=" + str(self.tests_failed))
         if (self.tests_failed > 0):
             self.gather_debug_data()
 
     def gather_debug_data(self):
 
-        for application in self.APPLICATIONS.keys():
+        for application in list(self.APPLICATIONS.keys()):
             self.gather_application_data(application, self.APPLICATIONS.get(application))
 
     def gather_application_data(self, application, ip):
index 15c5689..93d556a 100644 (file)
@@ -1,51 +1,52 @@
 import json
 import yaml
-import StringIO
+import io
 import copy
 from hashlib import md5
 from paramiko import RSAKey
 from paramiko.ssh_exception import PasswordRequiredException
 
+
 class HEATUtils:
     """ Utilities useful for constructing OpenStack HEAT requests """
 
     def get_yaml(self, template_file):
         """Template Yaml To Json reads a YAML Heat template file returns a JSON string that can be used included in an Openstack Add Stack Request"""
-        if isinstance(template_file, basestring):
+        if isinstance(template_file, str):
             fin = open(template_file, 'r')
             yamlobj = yaml.load(fin)
             return yamlobj
         return None
-    
+
     def template_yaml_to_json(self, template_file):
         """Template Yaml To Json reads a YAML Heat template file returns a JSON string that can be used included in an Openstack Add Stack Request"""
-        if isinstance(template_file, basestring):
+        if isinstance(template_file, str):
             fin = open(template_file, 'r')
             yamlobj = yaml.load(fin)
             fin.close()
             if 'heat_template_version' in yamlobj:
                 datetime = yamlobj['heat_template_version']
                 yamlobj['heat_template_version'] = str(datetime)
-            fout = StringIO.StringIO()
+            fout = io.BytesIO()
             json.dump(yamlobj, fout)
             contents = fout.getvalue()
             fout.close()
         return contents
-    
+
     def env_yaml_to_json(self, template_file):
         """Env Yaml To JSon reads a YAML Heat env file and returns a JSON string that can be used included in an Openstack Add Stack Request"""
-        if isinstance(template_file, basestring):
+        if isinstance(template_file, str):
             fin = open(template_file, 'r')
             yamlobj = yaml.load(fin)
             fin.close()
             if 'parameters' in yamlobj:
-                fout = StringIO.StringIO()
+                fout = io.BytesIO()
                 json.dump(yamlobj['parameters'], fout)
                 contents = fout.getvalue()
                 fout.close()
                 return contents
         return None
-    
+
     def stack_info_parse(self, stack_info):
         """ returns a flattened version of the Openstack Find Stack results """
         d = {}
@@ -56,24 +57,23 @@ class HEATUtils:
             d['id'] = s['id']
             d['name'] = s['stack_name']
             d['stack_status'] = s['stack_status']
-        return d    
-    
-    
+        return d
+
     def match_fingerprint(self, pvt_file, pw, fingerprint):
         try:
             sshKey = RSAKey.from_private_key_file(pvt_file, pw)
             keybytes = md5(sshKey.asbytes()).hexdigest()
-            printableFingerprint = ':'.join(a+b for a,b in zip(keybytes[::2], keybytes[1::2]))
+            printableFingerprint = ':'.join(a + b for a, b in zip(keybytes[::2], keybytes[1::2]))
             return printableFingerprint == fingerprint.__str__()
         except PasswordRequiredException:
-            return False    
-    
+            return False
+
     def match_private_key_file_to_keypair(self, files, keypair):
         for keyfile in files:
             if (self.match_fingerprint(keyfile, None, keypair['keypair']['fingerprint'])):
                 return keyfile
         return None
-    
+
     def get_openstack_server_ip(self, server, network_name="public", ipversion=4):
         ipaddr = None
         try:
index 9324af7..624efd1 100644 (file)
@@ -1,6 +1,8 @@
+from six.moves.urllib.parse import urlparse
+
 import urllib
 import urllib3
-import urlparse
+
 
 class HTTPUtils:
     """HTTPUtils is common resource for simple http helper keywords."""
index de5da6b..e5de182 100644 (file)
@@ -7,11 +7,11 @@ class JSONUtils:
     
     def json_equals(self, left, right):
         """JSON Equals takes in two strings or json objects, converts them into json if needed and then compares them, returning if they are equal or not."""
-        if isinstance(left, basestring):
+        if isinstance(left, str):
             left_json = json.loads(left);
         else:
             left_json = left;
-        if isinstance(right, basestring):
+        if isinstance(right, str):
             right_json = json.loads(right);
         else:
             right_json = right;
index adb12db..8791450 100644 (file)
@@ -23,7 +23,7 @@ class OpenstackLibrary:
     def get_openstack_token(self, alias):
         """Get Openstack auth token from the current alias"""
         response = self._cache.switch(alias)
-        if isinstance(response, basestring):
+        if isinstance(response, str):
             jsonResponse = json.loads(response);
         else:
             jsonResponse = response;
@@ -35,7 +35,7 @@ class OpenstackLibrary:
     def get_openstack_catalog(self, alias):
         """Get Openstack service catalog from the current alias"""
         response = self._cache.switch(alias)
-        if isinstance(response, basestring):
+        if isinstance(response, str):
             jsonResponse = json.loads(response);
         else:
             jsonResponse = response;
@@ -48,7 +48,7 @@ class OpenstackLibrary:
     def get_current_openstack_tenant(self, alias):
         """Get Openstack tenant from the current alias"""
         response = self._cache.switch(alias)
-        if isinstance(response, basestring):
+        if isinstance(response, str):
             jsonResponse = json.loads(response);
         else:
             jsonResponse = response;
@@ -65,7 +65,7 @@ class OpenstackLibrary:
     def get_openstack_regions(self, alias):
         """Get all Openstack regions from the current alias"""
         response = self._cache.switch(alias)
-        if isinstance(response, basestring):
+        if isinstance(response, str):
             jsonResponse = json.loads(response);
         else:
             jsonResponse = response;
@@ -85,7 +85,7 @@ class OpenstackLibrary:
     def get_openstack_service_url(self, alias, servicetype, region =  None, tenant_id = None):
         """Get Openstack service catalog from the current alias"""
         response = self._cache.switch(alias)
-        if isinstance(response, basestring):
+        if isinstance(response, str):
             jsonResponse = json.loads(response);
         else:
             jsonResponse = response;
@@ -103,7 +103,7 @@ class OpenstackLibrary:
                 # Only provide tenant id when authorizing without qualifying with tenant id
                 # WindRiver does not return the tenantId on the endpoint in this case.
                 if tenant_id is not None:
-                       listOfEndpoints[:] = [y for y in listOfEndpoints if self.__determine_match(y['tenantId'], tenant_id)];
+                    listOfEndpoints[:] = [y for y in listOfEndpoints if self.__determine_match(y['tenantId'], tenant_id)];
                 if jsonResponse['keystone_api_version'] == 'v3':
                         listOfEndpoints[:] = [z for z in listOfEndpoints if self.__determine_match(z['interface'], 'public')];
                 if len(listOfEndpoints) > 0:
index 0f579e7..5e701a7 100644 (file)
@@ -29,6 +29,5 @@ class TemplatingEngine:
 
     def apply_template(self, template_location, values):
         """returns a string that is the jinja template in template_location filled in via the dictionary in values """
-        print
         template = self.jinja_env.get_template(template_location)
-        return template.render(values)
\ No newline at end of file
+        return template.render(values)
index 35c26a7..1500076 100644 (file)
@@ -12,4 +12,4 @@ class UUID:
     def generate_MilliTimestamp_UUID(self):
         """generate a millisecond timestamp uuid"""
         then = datetime.datetime.now()
-        return int(time.mktime(then.timetuple())*1e3 + then.microsecond/1e3)
\ No newline at end of file
+        return int(time.mktime(then.timetuple())*1e3 + then.microsecond/1e3)
index 5012e7d..0d5df84 100644 (file)
@@ -34,6 +34,6 @@ class RunEte(Thread):
             env = dict(os.environ, SOAKSUBFOLDER=self.soaksubfolder + "/")
             output = subprocess.check_output(["bash", self.robot_command, self.robot_test, self.test_number], shell=False, env=env)
             logging.info("{} ({}) {}".format(self.getName(), self.robot_test, output))
-        except Exception, e:
+        except Exception as e:
             logging.error("{} ({}) Unexpected error {}".format(self.getName(), self.robot_test, repr(e)))
         logging.info("{} ({}) ended - {}".format(self.getName(), self.robot_test, str(datetime.now())))
index 81c635f..3e8eb72 100644 (file)
@@ -66,7 +66,7 @@ def main(argv=None):
         controller = TestController(opts)
         controller.execute()
 
-    except Exception, e:
+    except Exception as e:
         indent = len(program_name) * " "
         sys.stderr.write(program_name + ": " + repr(e) + "\n")
         sys.stderr.write(indent + "  for help use --help")
@@ -75,7 +75,7 @@ def main(argv=None):
 
 if __name__ == "__main__":
     if DEBUG:
-        print "debug"
+        print("debug")
     if TESTRUN:
         import doctest
         doctest.testmod()
index 493416b..c34b498 100644 (file)
@@ -2,4 +2,4 @@
 # This flag says that the code is written to work on both Python 2 and Python
 # 3. If at all possible, it is good practice to do this. If you cannot, you
 # will need to generate wheels for each Python version that you support.
-universal=0
\ No newline at end of file
+universal=1
\ No newline at end of file
index c5460de..969fe9d 100644 (file)
@@ -17,7 +17,7 @@ from setuptools import setup
 
 setup(
     name='robotframework-onap',            # This is the name of your PyPI-package.
-    keywords=("utils", "robotframework", "testing", "onap"),
+    keywords=["utils", "robotframework", "testing", "onap"],
     version='0.4',                          # Update the version number for new releases
     license="Apache 2.0",
     description='Scripts written to be used during robot framework testing',    # Info about script
@@ -31,8 +31,11 @@ setup(
         'paramiko',
         'pyyaml',
         'robotframework',
-        'deepdiff>=2.5,<3.3',
-        'Jinja2'
+        'deepdiff',
+        'Jinja2',
+        'urllib3',
+        'six',
+        'requests'
     ],  # what we need
     packages=['eteutils', 'loadtest', 'vcpeutils'],       # The name of your scripts package
     package_dir={'eteutils': 'eteutils', 'loadtest': 'loadtest', 'vcpeutils':'vcpeutils'}, # The location of your scipts package
@@ -40,6 +43,7 @@ setup(
         'Development Status :: 4 - Beta',
         'Intended Audience :: Developers',
         'Programming Language :: Python :: 2.7',
+        'Programming Language :: Python :: 3.7',
         'Environment :: Plugins',
         'Framework :: Robot Framework',
         'Framework :: Robot Framework :: Library',
index 42183a7..0565053 100644 (file)
@@ -4,7 +4,7 @@
 # and then run "tox" from this directory.
 
 [tox]
-envlist = py27
+envlist = py27, py37
 
 [testenv]
 commands =  {envpython} setup.py test
index 1248613..c52006d 100755 (executable)
@@ -1,15 +1,10 @@
 #! /usr/bin/python
 
-import sys
-import logging
-import requests
-import json
-from datetime import datetime
-#import progressbar
 import time
-import csar_parser
-import preload
-from vcpecommon import *
+
+from .csar_parser import *
+from .preload import *
+from .vcpecommon import *
 from robot.api import logger
 
 
@@ -212,7 +207,7 @@ class SoUtils:
         return {'requestDetails': req_details}
 
     def create_custom_service(self, csar_file, brg_mac, name_suffix=None):
-        parser = csar_parser.CsarParser()
+        parser = CsarParser()
         if not parser.parse_csar(csar_file):
             return False
 
@@ -259,7 +254,7 @@ class SoUtils:
         self.tenant_id=tenant_id
         self.logger.info('\n----------------------------------------------------------------------------------')
         self.logger.info('Start to create entire service defined in csar: {0}'.format(csar_file))
-        parser = csar_parser.CsarParser()
+        parser = CsarParser()
         self.logger.info('Parsing csar ...')
         if not parser.parse_csar(csar_file):
             self.logger.error('Cannot parse csar: {0}'.format(csar_file))
@@ -337,7 +332,7 @@ class SoUtils:
 
         # SDNC Preload 
 
-        preloader = preload.Preload(self.vcpecommon)
+        preloader = Preload(self.vcpecommon)
         preloader.preload_vfmodule(vnf_template_file, svc_instance_id, parser.vnf_models[0], parser.vfmodule_models[0],
                                    preload_dict, name_suffix)
 
index f101364..7440310 100755 (executable)
@@ -115,7 +115,7 @@ class CsarParser:
             },
         """
         node_dic = svc_template['topology_template']['node_templates']
-        for node_name, v in node_dic.items():
+        for node_name, v in list(node_dic.items()):
             model = {
                 'modelInvariantId':  v['metadata']['invariantUUID'],
                 'modelVersionId': v['metadata']['UUID'],
@@ -177,7 +177,7 @@ class CsarParser:
             },
         """
         node_dic = svc_template['topology_template']['groups']
-        for node_name, v in node_dic.items():
+        for node_name, v in list(node_dic.items()):
             if v['type'].startswith('org.openecomp.groups.VfModule'):
                 model = {
                     'modelType': 'vfModule',
@@ -212,19 +212,19 @@ class CsarParser:
 
     def print_models(self):
         print('---------Service Model----------')
-        print(json.dumps(self.svc_model, indent=2, sort_keys=True))
+        print((json.dumps(self.svc_model, indent=2, sort_keys=True)))
 
         print('---------Network Model(s)----------')
         for model in self.net_models:
-            print(json.dumps(model, indent=2, sort_keys=True))
+            print((json.dumps(model, indent=2, sort_keys=True)))
 
         print('---------VNF Model(s)----------')
         for model in self.vnf_models:
-            print(json.dumps(model, indent=2, sort_keys=True))
+            print((json.dumps(model, indent=2, sort_keys=True)))
 
         print('---------VF Module Model(s)----------')
         for model in self.vfmodule_models:
-            print(json.dumps(model, indent=2, sort_keys=True))
+            print((json.dumps(model, indent=2, sort_keys=True)))
 
     def test(self):
         self.parse_csar('csar/service-Vcpesvcinfra111601-csar.csar')
index aab28f9..6ccc689 100755 (executable)
@@ -1,12 +1,8 @@
 #! /usr/bin/python
 
-import requests
-import json
-import sys
 from datetime import datetime
-from vcpecommon import *
-import csar_parser
-#import logging
+from .vcpecommon import *
+from .csar_parser import *
 from robot.api import logger
 import base64
 
@@ -18,7 +14,7 @@ class Preload:
         self.vcpecommon = vcpecommon
 
     def replace(self, sz, replace_dict):
-        for old_string, new_string in replace_dict.items():
+        for old_string, new_string in list(replace_dict.items()):
             sz = sz.replace(old_string, new_string)
         if self.vcpecommon.template_variable_symbol in sz:
             self.logger.error('Error! Cannot find a value to replace ' + sz)
@@ -30,12 +26,12 @@ class Preload:
             stk = [json_data]
             while len(stk) > 0:
                 data = stk.pop()
-                for k, v in data.items():
+                for k, v in list(data.items()):
                     if type(v) is dict:
                         stk.append(v)
                     elif type(v) is list:
                         stk.extend(v)
-                    elif type(v) is str or type(v) is unicode:
+                    elif type(v) is str or type(v) is str:
                         if self.vcpecommon.template_variable_symbol in v:
                             data[k] = self.replace(v, replace_dict)
                     else:
@@ -166,8 +162,8 @@ class Preload:
         return self.preload(template_file, replace_dict, self.vcpecommon.sdnc_preload_vnf_url)
 
     def preload_all_networks(self, template_file, name_suffix):
-        common_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
-        for network, v in self.vcpecommon.preload_network_config.items():
+        common_dict = {'${' + k + '}': v for k, v in list(self.vcpecommon.common_preload_config.items())}
+        for network, v in list(self.vcpecommon.preload_network_config.items()):
             subnet_start_ip, subnet_gateway_ip = v
             if not self.preload_network(template_file, network, subnet_start_ip, subnet_gateway_ip,
                                         common_dict, name_suffix):
@@ -180,15 +176,15 @@ class Preload:
         vcpecommon = VcpeCommon()
         preloader = Preload(vcpecommon)
 
-        network_dict = {'${' + k + '}': v for k, v in self.vcpecommon.common_preload_config.items()}
+        network_dict = {'${' + k + '}': v for k, v in list(self.vcpecommon.common_preload_config.items())}
         template_file = 'preload_templates/template.network.json'
-        for k, v in self.vcpecommon.preload_network_config.items():
+        for k, v in list(self.vcpecommon.preload_network_config.items()):
             if not preloader.preload_network(template_file, k, v[0], v[1], network_dict, name_suffix):
                 break
 
         print('---------------------------------------------------------------')
         print('Network related replacement dictionary:')
-        print(json.dumps(network_dict, indent=4, sort_keys=True))
+        print((json.dumps(network_dict, indent=4, sort_keys=True)))
         print('---------------------------------------------------------------')
 
         keys = ['infra', 'bng', 'gmux', 'brg']
@@ -196,7 +192,7 @@ class Preload:
             csar_file = self.vcpecommon.find_file(key, 'csar', 'csar')
             template_file = self.vcpecommon.find_file(key, 'json', 'preload_templates')
             if csar_file and template_file:
-                parser = csar_parser.CsarParser()
+                parser = CsarParser()
                 parser.parse_csar(csar_file)
                 service_instance_id = 'test112233'
                 preloader.preload_vfmodule(template_file, service_instance_id, parser.vnf_models[0],
@@ -207,7 +203,7 @@ class Preload:
         template_sniro_request = self.vcpecommon.find_file('sniro_request', 'json', 'preload_templates')
 
         vcperescust_csar = self.vcpecommon.find_file('rescust', 'csar', 'csar')
-        parser = csar_parser.CsarParser()
+        parser = CsarParser()
         parser.parse_csar(vcperescust_csar)
         tunnelxconn_ar_name = None
         brg_ar_name = None
index 95b5bbe..0d45ee3 100755 (executable)
@@ -7,10 +7,6 @@ import sys
 
 import ipaddress
 import requests
-import commands
-import time
-from novaclient import client as openstackclient
-from netaddr import IPAddress, IPNetwork
 
 class VcpeCommon:
     #############################################################################################
@@ -212,7 +208,7 @@ class VcpeCommon:
         return '_'.join(fields)
 
     def set_network_name(self, network_name):
-        param = ' '.join([k + ' ' + v for k, v in self.cloud.items()])
+        param = ' '.join([k + ' ' + v for k, v in list(self.cloud.items())])
         openstackcmd = 'openstack ' + param
         cmd = ' '.join([openstackcmd, 'network set --name', network_name, 'ONAP-NW1'])
         os.popen(cmd)
@@ -223,7 +219,7 @@ class VcpeCommon:
         set subnet name to vcpe_net_cpe_signal_subnet_201711281221
         :return:
         """
-        param = ' '.join([k + ' ' + v for k, v in self.cloud.items()])
+        param = ' '.join([k + ' ' + v for k, v in list(self.cloud.items())])
         openstackcmd = 'openstack ' + param
 
         # expected results: | subnets | subnet_id |
@@ -271,10 +267,10 @@ class VcpeCommon:
         :param sz: a string
         :return: the first IP address matching the network, e.g. 10.5.12.3
         """
-        network = ipaddress.ip_network(unicode('{0}/{1}'.format(net_addr, net_addr_len)), strict=False)
+        network = ipaddress.ip_network(str('{0}/{1}'.format(net_addr, net_addr_len)), strict=False)
         ip_list = re.findall(r'[0-9]+(?:\.[0-9]+){3}', sz)
         for ip in ip_list:
-            this_net = ipaddress.ip_network(unicode('{0}/{1}'.format(ip, net_addr_len)), strict=False)
+            this_net = ipaddress.ip_network(str('{0}/{1}'.format(ip, net_addr_len)), strict=False)
             if this_net == network:
                 return str(ip)
         return None