diff --git a/Dockerfile b/Dockerfile index bb9accc..853198b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -11,7 +11,7 @@ RUN apt-get update -y && apt-get install -qy gnupg software-properties-common RUN add-apt-repository -y ppa:deadsnakes/ppa RUN apt-get -qq update -y \ && apt-get install -y mysql-server redis-server zookeeper nodejs npm ceph librados-dev \ - python3 python3-dev python3-pip python3.9 python3.9-dev python3.9-distutils \ + python3 python3-dev python3-pip python3.9 python3.9-dev \ gcc liberasurecode-dev liberasurecode1 postgresql libpq-dev python3-rados git wget memcached \ && rm -rf /var/lib/apt/lists/* diff --git a/pifpaf/drivers/__init__.py b/pifpaf/drivers/__init__.py index 98b7343..ca71355 100644 --- a/pifpaf/drivers/__init__.py +++ b/pifpaf/drivers/__init__.py @@ -16,12 +16,12 @@ import os import re import select +import shutil import socket import subprocess import sys import threading import time -from distutils import spawn import fixtures @@ -102,7 +102,7 @@ def _kill(self, parent): def find_executable(filename, extra_paths): paths = extra_paths + os.getenv('PATH', os.defpath).split(os.pathsep) for path in paths: - loc = spawn.find_executable(filename, path) + loc = shutil.which(filename, path=path) if loc is not None: return loc diff --git a/pifpaf/tests/test_cli.py b/pifpaf/tests/test_cli.py index 11395cc..ccde70b 100644 --- a/pifpaf/tests/test_cli.py +++ b/pifpaf/tests/test_cli.py @@ -12,9 +12,9 @@ # limitations under the License. import os +import shutil import signal import subprocess -from distutils import spawn import fixtures @@ -23,7 +23,7 @@ class TestCli(testtools.TestCase): - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_cli(self): self.assertEqual(0, os.system( @@ -39,7 +39,7 @@ def _read_stdout_and_kill(stdout): signal.SIGTERM) return env - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_eval(self): c = subprocess.Popen(["pifpaf", "run", "memcached", "--port", "11219"], @@ -53,7 +53,7 @@ def test_eval(self): self.assertEqual(b"\"memcached://localhost:11219\";", env[b"export PIFPAF_MEMCACHED_URL"]) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_exit_code(self): c = subprocess.Popen(["pifpaf", "run", "memcached", "--port", "11234", @@ -62,7 +62,7 @@ def test_exit_code(self): (stdout, stderr) = c.communicate() self.assertEqual(31, c.wait()) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_env_prefix(self): c = subprocess.Popen(["pifpaf", "run", @@ -81,7 +81,7 @@ def test_env_prefix(self): self.assertEqual(env[b"export PIFPAF_PID"], env[b"export FOOBAR_PID"]) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_env_prefix_old_format(self): # Old format @@ -101,7 +101,7 @@ def test_env_prefix_old_format(self): self.assertEqual(env[b"export PIFPAF_PID"], env[b"export FOOBAR_PID"]) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_global_urls_variable(self): c = subprocess.Popen(["pifpaf", "run", @@ -124,7 +124,7 @@ def test_global_urls_variable(self): b"\"memcached://localhost:11217;memcached://localhost:11218\";", env[b"export PIFPAF_URLS"]) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_global_urls_variable_old_format(self): c = subprocess.Popen(["pifpaf", diff --git a/pifpaf/tests/test_drivers.py b/pifpaf/tests/test_drivers.py index 9b1440a..80a159c 100644 --- a/pifpaf/tests/test_drivers.py +++ b/pifpaf/tests/test_drivers.py @@ -15,8 +15,8 @@ import logging import os +import shutil import socket -from distutils import spawn import fixtures @@ -110,7 +110,7 @@ def test_stuck_simple(self): "trap ':' TERM ; echo started; sleep 10000"]) @testtools.skip("Driver need rework") - @testtools.skipUnless(spawn.find_executable("elasticsearch"), + @testtools.skipUnless(shutil.which("elasticsearch"), "elasticsearch not found") def test_elasticsearch(self): port = 9201 @@ -121,9 +121,9 @@ def test_elasticsearch(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("etcd"), + @testtools.skipUnless(shutil.which("etcd"), "etcd not found") - @testtools.skipUnless(spawn.find_executable("etcdctl"), + @testtools.skipUnless(shutil.which("etcdctl"), "etcdctl not found") def test_etcd(self): port = 4005 @@ -136,9 +136,9 @@ def test_etcd(self): self.assertEqual(200, r.status_code) self._run("etcdctl endpoint health") - @testtools.skipUnless(spawn.find_executable("etcd"), + @testtools.skipUnless(shutil.which("etcd"), "etcd not found") - @testtools.skipUnless(spawn.find_executable("etcdctl"), + @testtools.skipUnless(shutil.which("etcdctl"), "etcdctl not found") def test_etcd_cluster(self): port = 4007 @@ -152,7 +152,7 @@ def test_etcd_cluster(self): self.assertEqual(200, r.status_code) self._run("etcdctl endpoint health") - @testtools.skipUnless(spawn.find_executable("consul"), + @testtools.skipUnless(shutil.which("consul"), "consul not found") def test_consul(self): port = 8601 @@ -164,7 +164,7 @@ def test_consul(self): r = requests.get("http://%s:%d/v1/status/leader" % (host, port)) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("influxd"), + @testtools.skipUnless(shutil.which("influxd"), "influxd not found") def test_influxdb(self): port = 51236 @@ -176,7 +176,7 @@ def test_influxdb(self): self.assertEqual(database, os.getenv("PIFPAF_INFLUXDB_DATABASE")) self._run("influx -port %d -execute 'SHOW DATABASES;'" % port) - @testtools.skipUnless(spawn.find_executable("memcached"), + @testtools.skipUnless(shutil.which("memcached"), "memcached not found") def test_memcached(self): port = 11213 @@ -185,7 +185,7 @@ def test_memcached(self): os.getenv("PIFPAF_URL")) self.assertEqual(str(port), os.getenv("PIFPAF_MEMCACHED_PORT")) - @testtools.skipUnless(spawn.find_executable("vault"), + @testtools.skipUnless(shutil.which("vault"), "vault not found") def test_vault(self): listen_address = "localhost:5049" @@ -196,7 +196,7 @@ def test_vault(self): os.getenv("PIFPAF_VAULT_ADDR")) self.assertTrue(len(os.getenv("PIFPAF_ROOT_TOKEN")) > 0) - @testtools.skipUnless(spawn.find_executable("fakes3"), + @testtools.skipUnless(shutil.which("fakes3"), "fakes3 not found") def test_fakes3(self): port = 8990 @@ -205,7 +205,7 @@ def test_fakes3(self): os.getenv("PIFPAF_URL")) self.assertEqual(str(port), os.getenv("PIFPAF_FAKES3_PORT")) - @testtools.skipUnless(spawn.find_executable("s3rver"), + @testtools.skipUnless(shutil.which("s3rver"), "s3rver not found") def test_s3rver(self): port = 4569 @@ -215,7 +215,7 @@ def test_s3rver(self): self.assertEqual("http://localhost:%d" % port, os.getenv("PIFPAF_HTTP_URL")) - @testtools.skipUnless(spawn.find_executable("mongod"), + @testtools.skipUnless(shutil.which("mongod"), "mongod not found") def test_mongodb(self): port = 29002 @@ -226,7 +226,7 @@ def test_mongodb(self): self._run( "mongo --norc --host localhost --port %d --eval 'quit()'" % port) - @testtools.skipUnless(spawn.find_executable("mysqld"), + @testtools.skipUnless(shutil.which("mysqld"), "mysqld not found") def test_mysql(self): f = self.useFixture(mysql.MySQLDriver()) @@ -241,7 +241,7 @@ def test_mysql(self): self._run( "mysql --no-defaults -S %s -e 'SHOW TABLES;' pifpaf" % f.socket) - @testtools.skipUnless(spawn.find_executable("pg_config"), + @testtools.skipUnless(shutil.which("pg_config"), "pg_config not found") def test_postgresql(self): port = 9825 @@ -252,7 +252,7 @@ def test_postgresql(self): os.getenv("PIFPAF_URL")) self._run("psql template1 -c 'CREATE TABLE FOOBAR();'") - @testtools.skipUnless(spawn.find_executable("pg_config"), + @testtools.skipUnless(shutil.which("pg_config"), "pg_config not found") def test_postgresql_async(self): port = 9825 @@ -263,7 +263,7 @@ def test_postgresql_async(self): os.getenv("PIFPAF_URL")) self._run("psql template1 -c 'CREATE TABLE FOOBAR();'") - @testtools.skipUnless(spawn.find_executable("redis-server"), + @testtools.skipUnless(shutil.which("redis-server"), "redis-server not found") def test_redis(self): port = 6384 @@ -273,7 +273,7 @@ def test_redis(self): self.assertEqual(str(port), os.getenv("PIFPAF_REDIS_PORT")) self._run("redis-cli -p %d llen pifpaf" % f.port) - @testtools.skipUnless(spawn.find_executable("redis-server"), + @testtools.skipUnless(shutil.which("redis-server"), "redis-server not found") def test_redis_with_password(self): port = 6384 @@ -283,7 +283,7 @@ def test_redis_with_password(self): self.assertEqual(str(port), os.getenv("PIFPAF_REDIS_PORT")) self._run("redis-cli -p %d -a secrete llen pifpaf" % f.port) - @testtools.skipUnless(spawn.find_executable("redis-sentinel"), + @testtools.skipUnless(shutil.which("redis-sentinel"), "redis-sentinel not found") def test_redis_sentinel(self): port = 6385 @@ -295,7 +295,7 @@ def test_redis_sentinel(self): self._run("redis-cli -p %d sentinel master pifpaf" % f.sentinel_port) self._run("redis-cli -p %d llen pifpaf" % f.port) - @testtools.skipUnless(spawn.find_executable("redis-sentinel"), + @testtools.skipUnless(shutil.which("redis-sentinel"), "redis-sentinel not found") def test_redis_sentinel_with_password(self): port = 6385 @@ -309,7 +309,7 @@ def test_redis_sentinel_with_password(self): f.sentinel_port) self._run("redis-cli -p %d -a secrete llen pifpaf" % f.port) - @testtools.skipUnless(spawn.find_executable( + @testtools.skipUnless(shutil.which( "zkServer.sh", path=":".join(zookeeper.ZooKeeperDriver.PATH)), "ZooKeeper not found") def test_zookeeper(self): @@ -323,7 +323,7 @@ def test_zookeeper(self): reply = s.recv(1024) self.assertEqual(b"imok", reply) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") def test_gnocchi(self): port = gnocchi.GnocchiDriver.DEFAULT_PORT @@ -333,9 +333,9 @@ def test_gnocchi(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("redis-server"), + @testtools.skipUnless(shutil.which("redis-server"), "redis-server not found") - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") def test_gnocchi_with_redis_coordinator(self): self.useFixture(gnocchi.GnocchiDriver(coordination_driver="redis", @@ -345,7 +345,7 @@ def test_gnocchi_with_redis_coordinator(self): r = requests.get("http://localhost:%d/" % 8043) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") def test_gnocchi_with_existing_indexer(self): port = gnocchi.GnocchiDriver.DEFAULT_PORT + 15 @@ -357,9 +357,9 @@ def test_gnocchi_with_existing_indexer(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") - @testtools.skipUnless(spawn.find_executable("swift-proxy-server"), + @testtools.skipUnless(shutil.which("swift-proxy-server"), "Swift not found") def test_gnocchi_with_existing_swift(self): # This test produces a lot of logs and causes an error: @@ -379,9 +379,9 @@ def test_gnocchi_with_existing_swift(self): finally: drivers.LOG.setLevel(level) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") - @testtools.skipUnless(spawn.find_executable("s3rver"), + @testtools.skipUnless(shutil.which("s3rver"), "s3rver not found") def test_gnocchi_with_existing_s3rver(self): s3 = self.useFixture(s3rver.S3rverDriver(port=4569)) @@ -394,13 +394,13 @@ def test_gnocchi_with_existing_s3rver(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") - @testtools.skipUnless(spawn.find_executable("ceph-mon"), + @testtools.skipUnless(shutil.which("ceph-mon"), "Ceph Monitor not found") - @testtools.skipUnless(spawn.find_executable("ceph-osd"), + @testtools.skipUnless(shutil.which("ceph-osd"), "Ceph OSD not found") - @testtools.skipUnless(spawn.find_executable("ceph"), + @testtools.skipUnless(shutil.which("ceph"), "Ceph client not found") def test_gnocchi_with_existing_ceph(self): port = gnocchi.GnocchiDriver.DEFAULT_PORT + 10 @@ -419,11 +419,11 @@ def test_gnocchi_with_existing_ceph(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("pg_config"), + @testtools.skipUnless(shutil.which("pg_config"), "pg_config not found") - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") - @testtools.skipUnless(spawn.find_executable("aodh-api"), + @testtools.skipUnless(shutil.which("aodh-api"), "Aodh not found") def test_aodh_with_existing_db(self): pg = self.useFixture(postgresql.PostgreSQLDriver(port=12345)) @@ -433,9 +433,9 @@ def test_aodh_with_existing_db(self): r = requests.get(os.getenv("PIFPAF_AODH_HTTP_URL")) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("gnocchi-api"), + @testtools.skipUnless(shutil.which("gnocchi-api"), "Gnocchi not found") - @testtools.skipUnless(spawn.find_executable("aodh-api"), + @testtools.skipUnless(shutil.which("aodh-api"), "Aodh not found") def test_aodh(self): a = self.useFixture(aodh.AodhDriver()) @@ -444,7 +444,7 @@ def test_aodh(self): r = requests.get(os.getenv("PIFPAF_AODH_HTTP_URL")) self.assertEqual(200, r.status_code) - @testtools.skipUnless(spawn.find_executable("keystone-manage"), + @testtools.skipUnless(shutil.which("keystone-manage"), "Keystone not found") def test_keystone(self): self.skipTest( @@ -455,11 +455,11 @@ def test_keystone(self): r = requests.get(os.getenv("PIFPAF_KEYSTONE_HTTP_URL")) self.assertEqual(300, r.status_code) - @testtools.skipUnless(spawn.find_executable("ceph-mon"), + @testtools.skipUnless(shutil.which("ceph-mon"), "Ceph Monitor not found") - @testtools.skipUnless(spawn.find_executable("ceph-osd"), + @testtools.skipUnless(shutil.which("ceph-osd"), "Ceph OSD not found") - @testtools.skipUnless(spawn.find_executable("ceph"), + @testtools.skipUnless(shutil.which("ceph"), "Ceph client not found") def test_ceph(self): tmp_rootdir = self._get_tmpdir_for_xattr() @@ -469,7 +469,7 @@ def test_ceph(self): self.assertIn("ceph.conf", os.getenv("CEPH_CONF")) self.assertIn("ceph.conf", os.getenv("PIFPAF_CEPH_CONF")) - @testtools.skipUnless(spawn.find_executable("rabbitmq-server"), + @testtools.skipUnless(shutil.which("rabbitmq-server"), "RabbitMQ not found") def test_rabbitmq(self): a = self.useFixture(rabbitmq.RabbitMQDriver()) @@ -481,7 +481,7 @@ def test_rabbitmq(self): os.getenv("PIFPAF_RABBITMQ_NODENAME")) self.assertEqual(str(a.port), os.getenv("PIFPAF_RABBITMQ_PORT")) - @testtools.skipUnless(spawn.find_executable("rabbitmq-server"), + @testtools.skipUnless(shutil.which("rabbitmq-server"), "RabbitMQ not found") def test_rabbitmq_cluster(self): a = self.useFixture(rabbitmq.RabbitMQDriver(cluster=True, port=12345)) @@ -510,7 +510,7 @@ def test_rabbitmq_cluster(self): a.start_node(a.nodename + "-3@localhost") a.start_node(a.nodename + "-2@localhost") - @testtools.skipUnless(spawn.find_executable("couchdb"), + @testtools.skipUnless(shutil.which("couchdb"), "CouchDB not found") def test_couchdb(self): port = 6984 @@ -520,7 +520,7 @@ def test_couchdb(self): r = requests.get("http://localhost:%d/" % port) self.assertEqual(r.json()["couchdb"], "Welcome") - @testtools.skipUnless(spawn.find_executable("artemis"), + @testtools.skipUnless(shutil.which("artemis"), "Artemis not found") def test_artemis(self): self.useFixture(artemis.ArtemisDriver(port=54321)) @@ -530,7 +530,7 @@ def test_artemis(self): self.assertEqual("amqp://localhost:54321", os.getenv("PIFPAF_ARTEMIS_URL")) - @testtools.skipUnless(spawn.find_executable("qdrouterd"), + @testtools.skipUnless(shutil.which("qdrouterd"), "Qdrouterd not found") def test_qdrouterd(self): a = self.useFixture(qdrouterd.QdrouterdDriver(port=54321)) @@ -541,7 +541,7 @@ def test_qdrouterd(self): self.assertEqual("amqp://localhost:54321", os.getenv("PIFPAF_QDROUTERD_URL")) - @testtools.skipUnless(spawn.find_executable("kafka-server-start.sh"), + @testtools.skipUnless(shutil.which("kafka-server-start.sh"), "Kafka not found") def test_kafka(self): a = self.useFixture(kafka.KafkaDriver(port=54321, @@ -554,7 +554,7 @@ def test_kafka(self): self.assertEqual("PLAINTEXT://localhost:54321", os.getenv("PIFPAF_KAFKA_URL")) - @testtools.skipUnless(spawn.find_executable("swift-proxy-server"), + @testtools.skipUnless(shutil.which("swift-proxy-server"), "Swift not found") def test_swift(self): tmp_rootdir = self._get_tmpdir_for_xattr()