Salt: virtualenv_mod.manage throws error with virtualenv version higher then 20.x.x

Created on 5 May 2020  路  3Comments  路  Source: saltstack/salt

Description
Error appears when using virtualenv_mod.manage state if virtualenv installed version is higher then 20.x.x

Setup
my_virtualenv_create:

  virtualenv.managed:
    - name: {{ app_dir }}/service/venv
    - python: /bin/python3
    - requirements: {{ basedirs.app_dir }}/serivce/src/requirements.txt
    - user: {{ user }}

Steps to Reproduce the behavior

 ID: my_virtualenv_create
    Function: virtualenv.managed
        Name: /opt/apps/service/venv
      Result: False
     Comment: An exception occurred in this state: Traceback (most recent call last):
                File "/usr/lib/python2.7/site-packages/salt/state.py", line 1981, in call
                  **cdata['kwargs'])
                File "/usr/lib/python2.7/site-packages/salt/loader.py", line 1977, in wrapper
                  return f(*args, **kwargs)
                File "/usr/lib/python2.7/site-packages/salt/states/virtualenv_mod.py", line 209, in managed
                  **kwargs
                File "/usr/lib/python2.7/site-packages/salt/modules/virtualenv_mod.py", line 198, in create
                  virtualenv_version_info = virtualenv_ver(venv_bin, user=user, **kwargs)
                File "/usr/lib/python2.7/site-packages/salt/modules/virtualenv_mod.py", line 72, in virtualenv_ver
                  ret['stdout'].strip().split('rc')[0].split('.')]
              ValueError: invalid literal for int() with base 10: 'virtualenv 20'
     Started: 12:47:26.084687
    Duration: 379.362 ms
     Changes:

Expected behavior
Virtual env should be created with requirement without errors

Screenshots
Missing

Versions Report

salt --versions-report
(Provided by running salt --versions-report. Please also mention any differences in master/minion versions.)

Salt Version:
           Salt: 2019.2.2
Dependency Versions:
           cffi: 1.6.0
       cherrypy: Not Installed
       dateutil: Not Installed
      docker-py: Not Installed
          gitdb: Not Installed
      gitpython: Not Installed
          ioflo: Not Installed
         Jinja2: 2.7.2
        libgit2: 0.26.3
        libnacl: Not Installed
       M2Crypto: Not Installed
           Mako: Not Installed
   msgpack-pure: Not Installed
 msgpack-python: 0.5.6
   mysql-python: Not Installed
      pycparser: 2.14
       pycrypto: 2.6.1
   pycryptodome: Not Installed
         pygit2: 0.26.4
         Python: 2.7.5 (default, Aug  7 2019, 00:51:29)
   python-gnupg: Not Installed
         PyYAML: 3.11
          PyZMQ: 15.3.0
           RAET: Not Installed
          smmap: Not Installed
        timelib: Not Installed
        Tornado: 4.2.1
            ZMQ: 4.1.4
System Versions:
           dist: centos 7.7.1908 Core
         locale: UTF-8
        machine: x86_64
        release: 3.10.0-693.17.1.el7.x86_64
         system: Linux
        version: CentOS Linux 7.7.1908 Core

Additional context
Exception is caused by line of module parsing version number of virtualenv that is returned by
/usr/local/bin/virtualenv --version. Starting from some of 20.x.x version it also returns virtualenv binary location on the same line like:

virtualenv 20.0.20 from /Users/andrei.krauchanka/.virtualenvs/location/lib/python3.6/site-packages/virtualenv/__init__.py
Aluminium Bug Confirmed phase-plan severity-high status-in-prog

Most helpful comment

Looks like this could easily be fixed by checking for (virtualenv )?(\d\.?)+ instead. Just needs a couple of tests written.

All 3 comments

Looks like this could easily be fixed by checking for (virtualenv )?(\d\.?)+ instead. Just needs a couple of tests written.

I get a bit different traceback with 3000.2 on Sid:

     Comment: An exception occurred in this state: Traceback (most recent call last):                                                                        
                File "/usr/lib/python3/dist-packages/salt/state.py", line 1980, in call                                                                      
                  ret = self.states[cdata['full']](*cdata['args'],                                                                                           
                File "/usr/lib/python3/dist-packages/salt/loader.py", line 1977, in wrapper                                                                  
                  return f(*args, **kwargs)                                                                                                                  
                File "/usr/lib/python3/dist-packages/salt/states/virtualenv_mod.py", line 197, in managed                                                    
                  venv_ret = __salt__['virtualenv.create'](                                                                                                  
                File "/usr/lib/python3/dist-packages/salt/modules/virtualenv_mod.py", line 198, in create       
                  virtualenv_version_info = virtualenv_ver(venv_bin, user=user, **kwargs)                                                                    
                File "/usr/lib/python3/dist-packages/salt/modules/virtualenv_mod.py", line 57, in virtualenv_ver                                             
                  [int(i) for i in version.split('rc')[0].split('.')]                                                                                        
                File "/usr/lib/python3/dist-packages/salt/modules/virtualenv_mod.py", line 57, in <listcomp>                                                 
                  [int(i) for i in version.split('rc')[0].split('.')]         
              ValueError: invalid literal for int() with base 10: '21+ds'

I guess it does not like Debian Sid's version:

virtualenv --version
virtualenv 20.0.21+ds from /usr/lib/python3/dist-packages/virtualenv/__init__.py

I gues workaround is to just use cmd.run manually..?

@Talkless that, or patch virtualenv_mod

Was this page helpful?
0 / 5 - 0 ratings