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
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
Most helpful comment
Looks like this could easily be fixed by checking for
(virtualenv )?(\d\.?)+instead. Just needs a couple of tests written.