cros_venv: get it working w/Python3

BUG=chromium:1052692
TEST=CQ passes

Change-Id: I8df7f4a4713c5dc90988c47c3c137baff652ee18
diff --git a/venv/cros_venv/flock.py b/venv/cros_venv/flock.py
index 8b97cc2..af2bbab 100644
--- a/venv/cros_venv/flock.py
+++ b/venv/cros_venv/flock.py
@@ -79,7 +79,7 @@
                 try:
                     self._fd = os.open(self._lockfile,
                                        os.O_RDWR | os.O_CREAT,
-                                       0666)
+                                       0o666)
                     break
                 except OSError as e:  # pragma: no cover
                     logger.debug('Error opening lock file: %s', e)
diff --git a/venv/cros_venv/test_flock.py b/venv/cros_venv/test_flock.py
index 928a891..9c7e6c9 100644
--- a/venv/cros_venv/test_flock.py
+++ b/venv/cros_venv/test_flock.py
@@ -11,10 +11,15 @@
 import fcntl
 import logging
 import os
+import sys
 import unittest
 
 import mock
-import subprocess32
+
+if sys.version_info.major < 3:
+    import subprocess32 as subprocess
+else:
+    import subprocess
 
 from cros_venv import testcases
 from cros_venv import flock
@@ -146,9 +151,9 @@
 def _lock(filename):
     """Lock a file in another process for testing."""
     logger.debug('Grabbing external lock on %s', filename)
-    with subprocess32.Popen(
+    with subprocess.Popen(
             ['python', '-u', '-c', _LOCK_SCRIPT % {'filename': filename}],
-            stdout=subprocess32.PIPE) as proc:
+            stdout=subprocess.PIPE) as proc:
         logger.debug('Started external lock process for %s', filename)
         proc.stdout.readline()
         logger.debug('Finished grabbing external lock on %s', filename)
diff --git a/venv/cros_venv/test_venvlib.py b/venv/cros_venv/test_venvlib.py
index f53d6c5..36c8f05 100644
--- a/venv/cros_venv/test_venvlib.py
+++ b/venv/cros_venv/test_venvlib.py
@@ -6,12 +6,13 @@
 from __future__ import print_function
 from __future__ import unicode_literals
 
-from cStringIO import StringIO
 import os
+import sys
 import unittest
 import warnings
 
 import mock
+from six.moves import StringIO
 
 from cros_venv import flock
 from cros_venv import testcases
@@ -51,8 +52,11 @@
 
     def test_repr(self):
         """Test repr() on VirtualenvMissingError."""
-        self.assertEqual(repr(venvlib.VirtualenvMissingError('foo')),
-                         "VirtualenvMissingError(u'foo')")
+        if sys.version_info.major < 3:
+            exp = "VirtualenvMissingError(u'foo')"
+        else:
+            exp = "VirtualenvMissingError('foo')"
+        self.assertEqual(repr(venvlib.VirtualenvMissingError('foo')), exp)
 
 
 class VenvlibTmpDirTestCase(testcases.TmpdirTestCase):
@@ -68,10 +72,14 @@
             self.fail('OSError raised')
 
     def test__log_check_call(self):
+        if sys.version_info.major < 3:
+            exp = "Running [u'echo', u'hi']\nhi\n"
+        else:
+            exp = "Running ['echo', 'hi']\nhi\n"
         with open('tmp', 'w') as f:
             venvlib._log_check_call(['echo', 'hi'], logfile=f)
         with open('tmp', 'r') as f:
-            self.assertEqual(f.read(), "Running [u'echo', u'hi']\nhi\n")
+            self.assertEqual(f.read(), exp)
 
 
 class VenvPathsTestCase(unittest.TestCase):
@@ -80,8 +88,11 @@
 
     def test_repr(self):
         paths = venvlib._VenvPaths('/tmp')
-        self.assertEqual(repr(paths),
-                         "_VenvPaths(u'/tmp')")
+        if sys.version_info.major < 3:
+            exp = "_VenvPaths(u'/tmp')"
+        else:
+            exp = "_VenvPaths('/tmp')"
+        self.assertEqual(repr(paths), exp)
 
     def test_venvdir(self):
         """Test for venvdir attribute."""
diff --git a/venv/cros_venv/venvlib.py b/venv/cros_venv/venvlib.py
index cd6f097..b0eef45 100644
--- a/venv/cros_venv/venvlib.py
+++ b/venv/cros_venv/venvlib.py
@@ -20,11 +20,14 @@
 import tempfile
 import warnings
 
+import six
+
 from cros_venv import constants
 from cros_venv import flock
 
 _PACKAGE_DIR = os.path.join(constants.REPO_DIR, 'pip_packages')
-_VENV_PY = '/usr/bin/python2.7'
+_VENV_PY = ('/usr/bin/python%s.%s' %
+            (sys.version_info.major, sys.version_info.minor))
 _VIRTUALENV_COMMAND = 'virtualenv'
 
 # BASE_DEPENDENCIES are pip requirements automatically included in every
@@ -157,7 +160,7 @@
     Make sure to check for collisions.
     """
     hasher = hashlib.md5()
-    hasher.update(spec.reqs)
+    hasher.update(spec.reqs.encode('utf-8'))
     return hasher.hexdigest()
 
 
@@ -212,7 +215,7 @@
     try:
         _log_check_call(command, logfile=logfile, env=env)
     except OSError as e:
-        raise VirtualenvMissingError(e), None, sys.exc_info()[2]
+        six.reraise(VirtualenvMissingError(e), None, sys.exc_info()[2])
 
 
 class VirtualenvMissingError(Exception):
@@ -264,7 +267,7 @@
 
 def _get_python_version():
     """Return the version string for the current Python."""
-    return '.'.join(unicode(part) for part in sys.version_info[:3])
+    return '.'.join(str(part) for part in sys.version_info[:3])
 
 
 def _get_cache_dir():