teuthology/task/install: implement LooseVersion and use it
The distutils module was deprecated in Python 3.10 and removed in
Python 3.12. This commit replaces the deprecated distutils.version
imports with the a homebrew LooseVersion implementation.
Changes:
- implement LooseVersion which is able to parse versions like
'
10.2.2-63-g8542898-1trusty'.
- Replace distutils.version.LooseVersion with
teuthology.util.version.LooseVersion packaging.version.LooseVersion
Fixes:
```
Traceback (most recent call last):
File "/home/jenkins-build/build/workspace/ceph-api/build/../qa/tasks/vstart_runner.py", line 81, in <module>
from teuthology.orchestra.remote import RemoteShell
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/orchestra/remote.py", line 6, in <module>
import teuthology.lock.util
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/lock/util.py", line 6, in <module>
import teuthology.provision.downburst
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/provision/__init__.py", line 4, in <module>
import teuthology.exporter
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/exporter.py", line 11, in <module>
import teuthology.dispatcher
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/dispatcher/__init__.py", line 22, in <module>
from teuthology.dispatcher import supervisor
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/dispatcher/supervisor.py", line 18, in <module>
from teuthology.task import internal
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/task/internal/__init__.py", line 27, in <module>
from teuthology.task.internal.redhat import (setup_cdn_repo, setup_base_repo, # noqa
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/task/internal/redhat.py", line 13, in <module>
from teuthology.task.install.redhat import set_deb_repo
File "/tmp/tmp.xwxq8FOScf/teuthology/teuthology/task/install/__init__.py", line 14, in <module>
from distutils.version import LooseVersion
ModuleNotFoundError: No module named 'distutils'
```
Related: https://peps.python.org/pep-0632/
Signed-off-by: Kefu Chai <tchaikov@gmail.com>