[SDFAB-1197] First stab to update ONOS to py3

Update has been performed only on the scripts and the
executables strictly necessary for the following use cases:

- Build (including Intellij)
- Tests (including Intellij)
- Docker build (including dev and yourkit)
- Upload snapshot (including local)
- Release

Finally, fix the ability to run ONOS using onos-local targets,
stc and docker stc (aka up4 stc env). Last but not least, updated
the azul image to a newer one which exports also the PYTHONENCODING

Change-Id: Ie96f3a9c76dbba83b1fc3896a372f1045d3d7ccc
diff --git a/.bazelrc b/.bazelrc
index 2b9ed65..5faf22a 100644
--- a/.bazelrc
+++ b/.bazelrc
@@ -12,7 +12,7 @@
 build --tool_java_language_version=11
 build --tool_java_runtime_version=remotejdk_11
 
-build --host_force_python=PY2
+build --host_force_python=PY3
 
 build --nouse_ijars
 build --experimental_strict_action_env
diff --git a/Dockerfile b/Dockerfile
index 129e7cf..6a168c5 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -16,8 +16,8 @@
 
 ARG JOBS=2
 ARG PROFILE=default
-ARG TAG=11.0.8-11.41.23
-ARG JAVA_PATH=/usr/lib/jvm/zulu11-ca-amd64
+ARG TAG=11.0.13-11.52.13
+ARG JAVA_PATH=/usr/lib/jvm/zulu11
 
 # First stage is the build environment.
 # zulu-openjdk images are based on Ubuntu.
@@ -26,7 +26,6 @@
 ENV BUILD_DEPS \
     ca-certificates \
     zip \
-    python \
     python3 \
     git \
     bzip2 \
diff --git a/README.md b/README.md
index 63fe80d..47371fd 100644
--- a/README.md
+++ b/README.md
@@ -37,7 +37,6 @@
 * zip
 * curl
 * unzip
-* python2.7
 * python3 (needed by Bazel)
 
 ### Build ONOS from source
diff --git a/WORKSPACE-docker b/WORKSPACE-docker
index 1b2b0d7..d9c9b46 100644
--- a/WORKSPACE-docker
+++ b/WORKSPACE-docker
@@ -7,7 +7,7 @@
 # local_java_repository for docker based builds
 load("@bazel_tools//tools/jdk:local_java_repository.bzl", "local_java_repository")
 
-ABSOLUTE_JAVABASE = "/usr/lib/jvm/zulu11-ca-amd64"
+ABSOLUTE_JAVABASE = "/usr/lib/jvm/zulu11"
 
 local_java_repository(
   name = "dockerjdk",
diff --git a/tools/build/bazel/dependencies_pom_generator.py b/tools/build/bazel/dependencies_pom_generator.py
index f2df0c2..8c6483f 100755
--- a/tools/build/bazel/dependencies_pom_generator.py
+++ b/tools/build/bazel/dependencies_pom_generator.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 # Copyright 2019-present Open Networking Foundation
 #
 # Licensed under the Apache License, Version 2.0 (the "License");
@@ -20,7 +20,7 @@
 def resolve(mvn_coord):
     mvn_pieces = mvn_coord.split(":")
     if mvn_pieces[0] != "mvn":
-        raise ("Invalid Maven coordinate: %s" % mvn_coord)
+        raise ValueError("Invalid Maven coordinate: %s" % mvn_coord)
     return dict(
         groupId=mvn_pieces[1],
         artifactId=mvn_pieces[2],
@@ -79,7 +79,7 @@
                 dep_template.format(scope='test', **deps[x])
                 for x in test_deps])
         else:
-            for old, new in var_dict.items():
+            for old, new in list(var_dict.items()):
                 line = line.replace(old, new)
             new_lines.append(line)
 
@@ -111,7 +111,7 @@
     for var in args.vars:
         pieces = var.split('=')
         if len(pieces) != 2:
-            raise ("Invalid var '%s'" % var)
+            raise ValueError("Invalid var '%s'" % var)
         processed_vars["<!-- %s -->" % pieces[0]] = pieces[1]
 
     generate_pom(
diff --git a/tools/build/bazel/onos_app_bundler.py b/tools/build/bazel/onos_app_bundler.py
index 6c4ca68..5aa77a0 100755
--- a/tools/build/bazel/onos_app_bundler.py
+++ b/tools/build/bazel/onos_app_bundler.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2018-present Open Networking Foundation
 
@@ -60,5 +60,5 @@
         print('There must be an even number of args: file mvn_coords')
         sys.exit(2)
 
-    files = zip(*[iter(args)]*2)
+    files = list(zip(*[iter(args)]*2))
     generateOar(output, files)
diff --git a/tools/build/bazel/onos_app_tools.py b/tools/build/bazel/onos_app_tools.py
index 9979ab5..43cab17 100755
--- a/tools/build/bazel/onos_app_tools.py
+++ b/tools/build/bazel/onos_app_tools.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2018-present Open Networking Foundation
 
@@ -207,7 +207,7 @@
         values['category'] = options.category
         values['url'] = options.url
     elif options.write_app:
-        sys.stderr.write('ERROR: Feature Name, Version, and Title are required\n')
+        sys.stderr.write('ERROR: App Name, Origin, Category and URL are required\n')
         sys.stderr.flush()
         sys.exit(1)
 
diff --git a/tools/build/bazel/osgi_feature_bundler.py b/tools/build/bazel/osgi_feature_bundler.py
index a4550e0..f390c88 100755
--- a/tools/build/bazel/osgi_feature_bundler.py
+++ b/tools/build/bazel/osgi_feature_bundler.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2018-present Open Networking Foundation
 
@@ -56,5 +56,5 @@
         print('There must be an even number of args: file mvn_coords')
         sys.exit(2)
 
-    files = zip(*[iter(args)]*2)
+    files = list(zip(*[iter(args)]*2))
     writeFeatureBundle(output, files)
diff --git a/tools/build/bazel/pom_generator.py b/tools/build/bazel/pom_generator.py
index 2e16f49..1ad54ec 100755
--- a/tools/build/bazel/pom_generator.py
+++ b/tools/build/bazel/pom_generator.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2018-present Open Networking Foundation
 
@@ -49,7 +49,7 @@
         with open(name, "w") as file:
             file.write(msg)
     else:
-        print msg
+        print(msg)
 
 
 def write_pom(output, coords, deps):
@@ -70,7 +70,7 @@
     import sys
 
     if len(sys.argv) < 3:
-        print 'usage: pom_generator pom.xml maven_coords dep_coords1 dep_coords2 ...'
+        print('usage: pom_generator pom.xml maven_coords dep_coords1 dep_coords2 ...')
         sys.exit(1)
 
     output = sys.argv[1]
diff --git a/tools/build/onos-close-staging b/tools/build/onos-close-staging
index e70d119..1e37ef3 100755
--- a/tools/build/onos-close-staging
+++ b/tools/build/onos-close-staging
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 #
 # This script finds an open staging repository, checks that it contains an
 # expected artifact, attemps to close the repository, and checks that it is closed.
@@ -29,7 +29,7 @@
       resp.raise_for_status()
       return resp
     except requests.exceptions.HTTPError as e:
-      print 'Encountered error:', e
+      print('Encountered error:', e)
       error = e
       time.sleep(1)
   if error:
@@ -46,7 +46,7 @@
       resp.raise_for_status()
       return resp
     except requests.exceptions.HTTPError as e:
-      print 'Encountered error:', e
+      print('Encountered error:', e)
       error = e
       time.sleep(1)
   if error:
@@ -64,11 +64,11 @@
       repos.append(( entry['repositoryId'], entry['profileId'] ))
   
   if len(repos) > 1:
-    print 'Aborting... too many open staging repos'
-    print repos
+    print('Aborting... too many open staging repos')
+    print(repos)
     sys.exit(1)
   elif len(repos) == 0:
-    print 'Aborting... there are no open staging repos'
+    print('Aborting... there are no open staging repos')
     sys.exit(1)
 
   return repos[0]  
@@ -131,8 +131,8 @@
     if event['name'] == 'repositoryClosed':
       return True
     elif event['name'] == 'repositoryCloseFailed':
-      print 'Aborting... repository failed to close'
-      print json.dumps(activity, sort_keys=True, indent=2, separators=(',', ': '))
+      print('Aborting... repository failed to close')
+      print(json.dumps(activity, sort_keys=True, indent=2, separators=(',', ': ')))
       sys.exit(1)
   return False
 
@@ -144,12 +144,12 @@
     sys.stdout.write('.')
     sys.stdout.flush()     
     time.sleep(2)
-  print ' Closed.'
+  print(' Closed.')
 
 if __name__ == '__main__':
   repositoryId, profileId = getStagingRepo(GROUP_ID)
-  print 'Repository Id:', repositoryId
-  print 'Profile Id:', profileId
+  print('Repository Id:', repositoryId)
+  print('Profile Id:', profileId)
 
   checkStagingRepo(repositoryId, ARTIFACT, GROUP_ID, VERSION)
 
@@ -158,5 +158,5 @@
   waitClosed(repositoryId)
 
   if '-d' in sys.argv:
-    print 'Dropping repo %s' % repositoryId
+    print('Dropping repo %s' % repositoryId)
     dropRepo(repositoryId, profileId)
diff --git a/tools/build/onos-release-prerequisites b/tools/build/onos-release-prerequisites
index 92e201d..c1605ac 100755
--- a/tools/build/onos-release-prerequisites
+++ b/tools/build/onos-release-prerequisites
@@ -50,7 +50,7 @@
 
 # Tests availability of the required tools
 function testToolchain {
-    for tool in bash python git java javac mvn tar; do
+    for tool in bash python3 git java javac mvn tar; do
         testTool $tool;
     done
     testGerritTool
diff --git a/tools/build/onos-upload-artifacts.py b/tools/build/onos-upload-artifacts.py
index a9b24c5..d5f0079 100755
--- a/tools/build/onos-upload-artifacts.py
+++ b/tools/build/onos-upload-artifacts.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2018-present Open Networking Foundation
 
@@ -147,8 +147,8 @@
         with open(file, 'rb') as f:
             r = requests.post(url, data=f.read(), headers=headers, auth=(SONATYPE_USER, SONATYPE_PASSWORD))
             if r.status_code != 201:
-                print (r.status_code)
-                print (r.text)
+                print((r.status_code))
+                print((r.text))
                 sys.exit(1)
     else:
         # deploy to local repo
@@ -165,7 +165,7 @@
 
 
 def upload_file(src, dest):
-    print ("publishing: " + dest.replace("org/onosproject", ""))
+    print(("publishing: " + dest.replace("org/onosproject", "")))
     files = generate_metadata_files(src, dest)
     stage_files(files, dest)
 
@@ -174,7 +174,7 @@
     import sys
 
     if len(sys.argv) < 2:
-        print 'USAGE: upload-maven-artifacts catalog-file-name [nexus root url]'
+        print('USAGE: upload-maven-artifacts catalog-file-name [nexus root url]')
         sys.exit(1)
 
     input_list_file = sys.argv[1]
@@ -191,20 +191,20 @@
 
     if destination_repo_url is not None:
         if SONATYPE_USER is None:
-            print "Environment variable SONATYPE_USER must be set"
+            print("Environment variable SONATYPE_USER must be set")
             sys.exit(1)
 
         if SONATYPE_PASSWORD is None:
-            print "Environment variable SONATYPE_PASSWORD must be set"
+            print("Environment variable SONATYPE_PASSWORD must be set")
             sys.exit(1)
 
         if SONATYPE_PROFILE is None:
-            print "Environment variable SONATYPE_PROFILE must be set"
+            print("Environment variable SONATYPE_PROFILE must be set")
             sys.exit(1)
 
-        print ("Uploading to remote repo: " + destination_repo_url)
+        print(("Uploading to remote repo: " + destination_repo_url))
     else:
-        print ("Installing in local repo: " + local_maven_repo)
+        print(("Installing in local repo: " + local_maven_repo))
 
     list_file = open(input_list_file, "r")
     lines = list_file.readlines()
diff --git a/tools/build/uploadToS3.py b/tools/build/uploadToS3.py
index 720878c..c5dc841 100755
--- a/tools/build/uploadToS3.py
+++ b/tools/build/uploadToS3.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
 Upload a file to S3
 """
@@ -20,7 +20,7 @@
         key = basename( filename )
     else:
         key = dest + basename( filename ) #FIXME add the /
-    print '* Uploading', filename, 'to bucket', bucket, 'as', key
+    print('* Uploading', filename, 'to bucket', bucket, 'as', key)
     stdout.flush()
     start = time()
     def callback( transmitted, size ):
@@ -28,9 +28,9 @@
         elapsed = time() - start
         percent = 100.0 * transmitted / size
         kbps = .001 * transmitted / elapsed
-        print ( '\r%d bytes transmitted of %d (%.2f%%),'
+        print(( '\r%d bytes transmitted of %d (%.2f%%),'
                 ' %.2f KB/sec ' %
-                ( transmitted, size, percent, kbps ) ),
+                ( transmitted, size, percent, kbps ) ), end='\n')
         stdout.flush()
     conn = S3Connection()
     bucket = conn.get_bucket( bucket )
@@ -38,11 +38,11 @@
     k.key = key
     if overwrite or not k.exists():
         k.set_contents_from_filename( filename, cb=callback, num_cb=100 )
-        print
+        print()
         elapsed = time() - start
-        print "* elapsed time: %.2f seconds" % elapsed
+        print("* elapsed time: %.2f seconds" % elapsed)
     else:
-        print 'file', basename( filename ), 'already exists in', bucket.name
+        print('file', basename( filename ), 'already exists in', bucket.name)
 
 def testAccess( bucket=None ):
     "Verify access to a bucket"
@@ -51,7 +51,7 @@
 
     conn = S3Connection()
     bucket = conn.get_bucket( bucket )
-    print bucket.get_acl()
+    print(bucket.get_acl())
 
 
 if __name__ == '__main__':
diff --git a/tools/dev/Dockerfile-bazel b/tools/dev/Dockerfile-bazel
index 4860e04..1eae2df 100644
--- a/tools/dev/Dockerfile-bazel
+++ b/tools/dev/Dockerfile-bazel
@@ -19,8 +19,8 @@
 # COPY command incompatibilities).
 # e.g. docker build -t onosproject/onos:latest -f $ONOS_ROOT/tools/dev/Dockerfile-bazel $ONOS_ROOT/bazel-bin
 
-ARG TAG=11.0.8-11.41.23
-ARG JAVA_PATH=/usr/lib/jvm/zulu11-ca-amd64
+ARG TAG=11.0.13-11.52.13
+ARG JAVA_PATH=/usr/lib/jvm/zulu11
 
 # Firts stage to copy and untar ONOS archive inside the container.
 FROM bitnami/minideb:jessie as untar
diff --git a/tools/dev/Dockerfile-yourkit b/tools/dev/Dockerfile-yourkit
index 176c3b3..61fbe4f 100644
--- a/tools/dev/Dockerfile-yourkit
+++ b/tools/dev/Dockerfile-yourkit
@@ -17,8 +17,8 @@
 
 ARG JOBS=2
 ARG PROFILE=default
-ARG TAG=11.0.8-11.41.23
-ARG JAVA_PATH=/usr/lib/jvm/zulu11-ca-amd64
+ARG TAG=11.0.13-11.52.13
+ARG JAVA_PATH=/usr/lib/jvm/zulu11
 
 # First stage is the build environment.
 # zulu-openjdk images are based on Ubuntu.
@@ -30,7 +30,6 @@
 ENV BUILD_DEPS \
     ca-certificates \
     zip \
-    python \
     python3 \
     git \
     bzip2 \
diff --git a/tools/dev/bash_profile b/tools/dev/bash_profile
index eaff4b3..f6a9543 100644
--- a/tools/dev/bash_profile
+++ b/tools/dev/bash_profile
@@ -77,7 +77,7 @@
 alias ole='olo "ERROR|WARN|Exception|Error"'
 
 # Pretty-print JSON output
-alias pp='python -m json.tool'
+alias pp='python3 -m json.tool'
 
 # Short-hand to launch Java API docs, REST API docs and ONOS GUI
 alias docs='open $ONOS_ROOT/docs/target/site/apidocs/index.html'
diff --git a/tools/dev/bin/onos-gen-bazel-project b/tools/dev/bin/onos-gen-bazel-project
index 355193a..007a13a 100755
--- a/tools/dev/bin/onos-gen-bazel-project
+++ b/tools/dev/bin/onos-gen-bazel-project
@@ -1,4 +1,4 @@
-#!/usr/bin/env python2.7
+#!/usr/bin/env python3
 import os
 
 import subprocess
@@ -31,8 +31,9 @@
 
 def get_library_targets():
     this_dir = os.path.dirname(os.path.realpath(__file__))
+    # NOTE that here we depends on bazel generating utf-8 bytes
     out = subprocess.check_output([
-        "bazel", "query", "kind(\"java_library\", //...:all)"], cwd=this_dir)
+        "bazel", "query", "kind(\"java_library\", //...:all)"], cwd=this_dir, encoding='UTF-8')
     return out.strip().split("\n")
 
 
@@ -43,12 +44,12 @@
         "script_name": os.path.basename(__file__),
         "language_level": JAVA_LANGUAGE_LEVEL,
         "exclude_dirs": "\n".join(
-            map(lambda x: "  -" + x, EXCLUDE_DIRECTORIES)),
-        "targets": "\n".join(map(lambda x: "  " + x, all_targets)),
-        "test_sources": "\n".join(map(lambda x: "  " + x, TEST_SOURCES)),
+            ["  -" + x for x in EXCLUDE_DIRECTORIES]),
+        "targets": "\n".join(["  " + x for x in all_targets]),
+        "test_sources": "\n".join(["  " + x for x in TEST_SOURCES]),
     }
     return TEMPLATE.format(**data)
 
 
 if __name__ == "__main__":
-    print gen_project()
+    print(gen_project())
diff --git a/tools/package/onos_stage.py b/tools/package/onos_stage.py
index 7a48650..ac66906 100755
--- a/tools/package/onos_stage.py
+++ b/tools/package/onos_stage.py
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
  Copyright 2017-present Open Networking Foundation
 
diff --git a/tools/package/runtime/bin/_check-json b/tools/package/runtime/bin/_check-json
index 1eef25b..0ebaf2c 100644
--- a/tools/package/runtime/bin/_check-json
+++ b/tools/package/runtime/bin/_check-json
@@ -22,7 +22,7 @@
 # -----------------------------------------------------------------------------
 
 checkJson() {
-    cat ${1} | python -m json.tool >> /dev/null
+    cat ${1} | python3 -m json.tool >> /dev/null
     if [ "$?" -ne "0" ]; then
         echo "Not valid JSON File" && exit 1
     fi
diff --git a/tools/test/bin/atomix-gen-config b/tools/test/bin/atomix-gen-config
index c3c89ac..d32ca98 100755
--- a/tools/test/bin/atomix-gen-config
+++ b/tools/test/bin/atomix-gen-config
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
 usage: atomix-gen-config [-h] [-s PARTITION_SIZE] [-n NUM_PARTITIONS]
                          [node_ip] [filename] [node_ip [node_ip ...]]
@@ -112,7 +112,7 @@
   args = parser.parse_args()
   filename = args.filename
   partition_size = args.partition_size
-  local_member_id = get_local_node(args.node)
+  local_member_id = get_local_node(args.node, args.nodes)
   local_member_address = get_local_address(args.node, args.nodes)
   nodes = get_nodes(args.nodes)
   num_partitions = args.num_partitions
@@ -158,4 +158,4 @@
     with open(filename, 'w') as f:
       f.write(output)
   else:
-    print output
+    print(output)
diff --git a/tools/test/bin/onos-gen-config b/tools/test/bin/onos-gen-config
index b73df39..e214d2f 100755
--- a/tools/test/bin/onos-gen-config
+++ b/tools/test/bin/onos-gen-config
@@ -1,4 +1,4 @@
-#!/usr/bin/env python
+#!/usr/bin/env python3
 """
 usage: onos-gen-config [-h] [-s PARTITION_SIZE] [-n NUM_PARTITIONS]
                             [filename] [node_ip [node_ip ...]]
@@ -87,7 +87,7 @@
 
     args = parser.parse_args()
     node = args.node
-    print node
+    print(node)
     filename = args.filename
     nodes = get_nodes(args.nodes)
 
@@ -106,4 +106,4 @@
         with open(filename, 'w') as f:
             f.write(output)
     else:
-        print output
+        print(output)