Giter Club home page Giter Club logo

pifpaf's Introduction

Pifpaf

image

Pifpaf is a suite of fixtures and a command-line tool that allows to start and stop daemons for a quick throw-away usage. This is typically useful when needing these daemons to run integration testing. It originaly evolved from its precussor overtest.

Supported daemons

Pifpaf currently supports:

Usage

To use Pifpaf, simply call the pifpaf run $daemon <command> program that you need. It will setup the temporary environment and export a few environment variable for you to access it:

$ pifpaf run postgresql psql template1
Expanded display is used automatically.
Line style is unicode.
SET
psql (9.4.5)
Type "help" for help.

template1=# \l
                              List of databases
   Name    │ Owner │ Encoding │   Collate   │    Ctype    │ Access privileges
───────────┼───────┼──────────┼─────────────┼─────────────┼───────────────────
 postgres  │ jd    │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │
 template0 │ jd    │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │ =c/jd            ↵
           │       │          │             │             │ jd=CTc/jd
 template1 │ jd    │ UTF8     │ en_US.UTF-8 │ en_US.UTF-8 │ =c/jd            ↵
           │       │          │             │             │ jd=CTc/jd
(3 rows)

template1=# \q
$

You can also run it with no command line provided:

$ eval `pifpaf run memcached`
$ env | grep PIFPAF
PIFPAF_PID=13387
PIFPAF_DAEMON=memcached
PIFPAF_URL=memcached://localhost:11212
PIFPAF_MEMCACHED_URL=memcached://localhost:11212
$ pifpaf_stop

Killing the daemon whose PID is contained in $PIFPAF_PID will stop the launched daemon and clean the test environment. You can kill it yourself or use the defined function pifpaf_stop.

Environment variables

Pifpaf exports a few environment variable:

  • PIFPAF_DAEMON which contains the name of the daemon launched
  • PIFPAF_URL which contains the URL to the daemon
  • PIFPAF_PID the PID of the pifpaf daemon
  • PIFPAF_$daemon_* variables, which contains daemon specific variables, such as port, database name, URL, etc.

Running several programs at once

Pifpaf provides the ability to change the prefix of its environment variable, allowing you to nest several Pifpaf instances and therefore running several daemons at once:

$ pifpaf --env-prefix STORAGE run memcached -- pifpaf --env-prefix INDEX run postgresql $SHELL
$ env | grep STORAGE
STORAGE_DATA=/var/folders/7k/pwdhb_mj2cv4zyr0kyrlzjx40000gq/T/tmpVreJ0J
STORAGE_MEMCACHED_PORT=11212
STORAGE_URL=memcached://localhost:11212
STORAGE_PID=71019
STORAGE_DAEMON=memcached
STORAGE_MEMCACHED_URL=memcached://localhost:11212
$ env | grep INDEX
INDEX_DATA=/var/folders/7k/pwdhb_mj2cv4zyr0kyrlzjx40000gq/T/tmphAG7tf
INDEX_URL=postgresql://localhost/postgres?host=/var/folders/7k/pwdhb_mj2cv4zyr0kyrlzjx40000gq/T/tmphAG7tf&port=9824
INDEX_PID=71021
INDEX_DAEMON=postgresql
INDEX_POSTGRESQL_URL=postgresql://localhost/postgres?host=/var/folders/7k/pwdhb_mj2cv4zyr0kyrlzjx40000gq/T/tmphAG7tf&port=9824
$ echo $PIFPAF_URLS
memcached://localhost:11212;postgresql://localhost/postgres?host=/var/folders/7k/pwdhb_mj2cv4zyr0kyrlzjx40000gq/T/tmpQ2BWFH&port=9824

The PIFPAF_URLS environment variable will contain the list of all URLs detected and set-up by Pifpaf. You can override this variable name with the --global-urls-variable option.

How it works under the hood

Pifpaf will start the asked daemon using the current Posix user. The data file of the daemon will be placed in a temporary directory. The system-wide configured daemon that might exists is not touched at all.

Pifpaf expected to find daemon binaries on your system (like mysql, mysqld, pg_config, pg_ctl, rabbitmq-server, etc).

When the Python fixture is cleaned or when Pifpaf is terminated, the daemon is stopped and the temporary directory removed.

image

pifpaf's People

Contributors

ainoniwa avatar ajssmith avatar chungg avatar dims avatar douardda avatar eli-schwartz avatar esubramanian-godaddy avatar felixonmars avatar funkyhat avatar harlowja avatar jd avatar jkawamoto avatar kajinamit avatar kgiusti avatar mergify[bot] avatar moisesguimaraes avatar omartrigui avatar rafaelweingartner avatar sileht avatar sorrison avatar tobias-urdin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

pifpaf's Issues

elasticsearch fails to run on Arch Linux

I am getting the following errors when running the test suite for elasticsearch. I am not really familiar with elasticsearch myself, please let me know how I should proceed to test, thanks!

======================================================================
FAIL: pifpaf.tests.test_drivers.TestDrivers.test_elasticsearch
tags: worker-7
----------------------------------------------------------------------
traceback-1: {{{
Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 197, in setUp
    self._setUp()
  File "/home/felix/projects/pifpaf/pifpaf/drivers/elasticsearch.py", line 46, in _setUp
    wait_for_line=" started")
  File "/home/felix/projects/pifpaf/pifpaf/drivers/__init__.py", line 135, in _exec
    % (wait_for_line, b"".join(lines)))
RuntimeError: Program did not print: ` started'
Output: b'Exception in thread "main" ElasticsearchException[Failed to load logging configuration]; nested: NoSuchFileException[/usr/share/elasticsearch/config];\nLikely root cause: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config\n\tat sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)\n\tat sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55)\n\tat sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:144)\n\tat sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99)\n\tat java.nio.file.Files.readAttributes(Files.java:1737)\n\tat java.nio.file.FileTreeWalker.getAttributes(FileTreeWalker.java:225)\n\tat java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:276)\n\tat java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)\n\tat java.nio.file.Files.walkFileTree(Files.java:2662)\n\tat org.elasticsearch.common.logging.log4j.LogConfigurator.resolveConfig(LogConfigurator.java:142)\n\tat org.elasticsearch.common.logging.log4j.LogConfigurator.configure(LogConfigurator.java:103)\n\tat org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:243)\n\tat org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)\nRefer to the log for complete error details.\n'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 208, in setUp
    raise SetupError(details)
fixtures.fixture.SetupError: {}
}}}

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 197, in setUp
    self._setUp()
  File "/home/felix/projects/pifpaf/pifpaf/drivers/elasticsearch.py", line 46, in _setUp
    wait_for_line=" started")
  File "/home/felix/projects/pifpaf/pifpaf/drivers/__init__.py", line 135, in _exec
    % (wait_for_line, b"".join(lines)))
RuntimeError: Program did not print: ` started'
Output: b'Exception in thread "main" ElasticsearchException[Failed to load logging configuration]; nested: NoSuchFileException[/usr/share/elasticsearch/config];\nLikely root cause: java.nio.file.NoSuchFileException: /usr/share/elasticsearch/config\n\tat sun.nio.fs.UnixException.translateToIOException(UnixException.java:86)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:102)\n\tat sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:107)\n\tat sun.nio.fs.UnixFileAttributeViews$Basic.readAttributes(UnixFileAttributeViews.java:55)\n\tat sun.nio.fs.UnixFileSystemProvider.readAttributes(UnixFileSystemProvider.java:144)\n\tat sun.nio.fs.LinuxFileSystemProvider.readAttributes(LinuxFileSystemProvider.java:99)\n\tat java.nio.file.Files.readAttributes(Files.java:1737)\n\tat java.nio.file.FileTreeWalker.getAttributes(FileTreeWalker.java:225)\n\tat java.nio.file.FileTreeWalker.visit(FileTreeWalker.java:276)\n\tat java.nio.file.FileTreeWalker.walk(FileTreeWalker.java:322)\n\tat java.nio.file.Files.walkFileTree(Files.java:2662)\n\tat org.elasticsearch.common.logging.log4j.LogConfigurator.resolveConfig(LogConfigurator.java:142)\n\tat org.elasticsearch.common.logging.log4j.LogConfigurator.configure(LogConfigurator.java:103)\n\tat org.elasticsearch.bootstrap.Bootstrap.init(Bootstrap.java:243)\n\tat org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:35)\nRefer to the log for complete error details.\n'

Add qdrouterd support

Planning to update oslo.messaging amqp1 driver testing to incorporate use of pifpaf. Would like to propose adding qdrouterd driver to pifpaf as first step.

pifpaf needs a new maintainer

I stopped using pifpaf for a long time now and I don't plan on maintaining it anymore.

If any user wants to step up and take the stick, I'll be happy to pass the maintainership to somebody motivated.

Print output received when unexpected output is read

It can be difficult to sort out why this happens RuntimeError: Program did not print: `Available at http://' and would be helpful if you also included the output that was written as part of this error message.

I ran into:

Traceback (most recent call last):
File "/home/jenkins/openstack/python-aodhclient/.tox/py27/bin/gnocchi-api", line 14, in
my_ip = socket.gethostbyname(socket.gethostname())
socket.gaierror: [Errno -2] Name or service not known

and it wasn't clear until I figured out how to run this wrapper directly with extra flags specified (--debug).

Add kafka

Starting to look at oslo.messaging kafka driver (for notifications); but that thing doesn't have any apart upstream integration testing; so part 0 would be to get it into pifpaf and then start to do more work over there to actually use this feature :-P

Add apache artemis support

Looking to assess apache artemis broker for oslo.messaging amqp1 notification and would like to add artemis driver to pifpaf for integration testing, etc.

Adding Kinto service

Hello here, I discovered your project with the tweet about your last release on twitter.

We often need to start a kinto server to run our functional tests in various Python and Javascript projects.

Would you accept a contribution to be able to start a Kinto service with pifpaf?

setuptools warnings

 * QA Notice: setuptools warnings detected:
 * 
 * 	Usage of dash-separated 'author-email' will not be supported in future versions. Please use the underscore name 'author_email' instead
 * 	Usage of dash-separated 'description-file' will not be supported in future versions. Please use the underscore name 'description_file' instead
 * 	Usage of dash-separated 'home-page' will not be supported in future versions. Please use the underscore name 'home_page' instead

make Gnocchi logs accessible

i may be wrong, but it's impossible to debug when using pifpaf (at least for gnocchi). i've no idea what is happening internally since i only really have access to API only.

Ceph driver hangs with HEALTH_WARN

The ceph driver currently hangs in tests, repeating HEALTH_WARN:

EBUG [pifpaf.drivers] executing: ['ceph', '-c', '/home/felix/tmp/pifpaf/tmpbu55u6xd/ceph.conf', 'health']
DEBUG [pifpaf.drivers] ceph-mon[567946] output: 2021-05-20T13:25:08.553+0800 7f61b56bd640  0 mon.a@0(leader) e1 handle_command mon_command({"prefix": "health"} v 0) v1
DEBUG [pifpaf.drivers] ceph[568474] output: HEALTH_WARN mon is allowing insecure global_id reclaim; 1 pool(s) have no replicas configured
DEBUG [pifpaf.drivers] ceph-mon[567946] output: 2021-05-20T13:25:08.553+0800 7f61b56bd640  0 log_channel(audit) log [DBG] : from='client.? 127.0.0.1:0/1611198311' entity='client.admin' cmd=[{"prefix": "health"}]: dispatch

I am not familiar at all with ceph though. @tobias-urdin @chungg do you have any ideas here? (Whether we should allow HEALTH_WARN, or somehow make it HEALTH_OK?)

InfluxDB driver port conflict

If you have influxDB running in a standard configuration on standard ports you will get a port conflict when using pifpaf. Ideally pifpaf should use a non standard port.

pifpaf run influxdb -- bash
20ERROR: pifpaf: Program did not print: `Listening on HTTP: \[::\]:51234'
Output: 
8888888           .d888 888                   8888888b.  888888b.
888            d88P"  888                   888  "Y88b 888  "88b
888            888    888                   888    888 888  .88P
888   88888b.  888888 888 888  888 888  888 888    888 8888888K.
888   888 "88b 888    888 888  888  Y8bd8P' 888    888 888  "Y88b
888   888  888 888    888 888  888   X88K   888    888 888    888
888   888  888 888    888 Y88b 888 .d8""8b. 888  .d88P 888   d88P
8888888 888  888 888    888  "Y88888 888  888 8888888P"  8888888P"

2016/10/29 16:02:00 InfluxDB starting, version 0.10.0, branch unknown, commit unknown, built unknown
2016/10/29 16:02:00 Go version go1.6rc1, GOMAXPROCS set to 8
2016/10/29 16:02:00 Using configuration at: /tmp/tmp.eQkR5YLbmB/tmp0qHDLT/config
[meta] 2016/10/29 16:02:00 Starting meta service
run: open server: open meta service: listen tcp 127.0.0.1:8091: bind: address already in use

Issue running rabbitmq

Upon running pifpaf run rabbitmq I get the following error:

ERROR [pifpaf] Unable to run command `rabbitmq-server': [Errno 2] No such file or directory: 'rabbitmq-server': 'rabbitmq-server'

My OS is OpenSUSE 42.3 x64

pifpaf psutil.AccessDenied

Hello,

I'm trying to use pifpaf in my tox testing automation suite but always fall under a weird issue.

I launch the following command before the tests as a standard user (non root)

pifpaf run mysql $SHELL

After the test I just use the exit command to log out from the created shell. Under normal circumstances, the mysqld process should be killed, rather it always raise the following exceptions

CRITICAL [root] Traceback (most recent call last):
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/psutil/__init__.py", line 1169, in _send_signal
    os.kill(self.pid, sig)
PermissionError: [Errno 13] Permission denied

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/home/gerges/PycharmProjects/freeradius-api/venv/bin/pifpaf", line 11, in <module>
    sys.exit(run_main())
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/pifpaf/__main__.py", line 269, in run_main
    return main.main(standalone_mode=False)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/click/core.py", line 717, in main
    rv = self.invoke(ctx)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/click/core.py", line 1137, in invoke
    return _process_result(sub_ctx.command.invoke(sub_ctx))
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/click/core.py", line 956, in invoke
    return ctx.invoke(self.callback, **ctx.params)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/click/core.py", line 555, in invoke
    return callback(*args, **kwargs)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/pifpaf/__main__.py", line 140, in _run_cb
    return self._run(name, plugin, ctx, *args, **kwargs)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/pifpaf/__main__.py", line 188, in _run
    return c.wait()
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/fixtures/fixture.py", line 157, in __exit__
    self._cleanups()
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/fixtures/callmany.py", line 89, in __call__
    reraise(error[0], error[1], error[2])
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/testtools/_compat3x.py", line 16, in reraise
    raise exc_obj.with_traceback(exc_tb)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/fixtures/callmany.py", line 83, in __call__
    cleanup(*args, **kwargs)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/pifpaf/drivers/__init__.py", line 129, in _kill
    parent.terminate()
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/psutil/__init__.py", line 284, in wrapper
    return fun(self, *args, **kwargs)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/psutil/__init__.py", line 1233, in terminate
    self._send_signal(signal.SIGTERM)
  File "/home/gerges/PycharmProjects/freeradius-api/venv/lib/python3.6/site-packages/psutil/__init__.py", line 1180, in _send_signal
    raise AccessDenied(self.pid, self._name)
psutil._exceptions.AccessDenied: psutil.AccessDenied (pid=10326)

Even when trying to kill the process using root (kill -9), it takes quite some time and the mysqld process end up as Zombie status.

Do you have any clue on this issue ? Am i doing something wrong with pifpaf ?

xattr issues on win64

Our project's test-requirements.txt refers to pifpaf>=0.0.11 (which, in turn, uses xattr). A colleague is trying our project out on win64 boxen and running into trouble when running a casual tox -e genconfig. He sees this (below), which I suppose makes sense on win64! Is there anything we can do to work around this with regard to pifpaf?

  build\temp.win32-2.7\Release\_lib.c(445) : fatal error C1083: Cannot open include file: 'sys/xattr.h': No such file or directory
  error: command 'C:\\Users\\ikram\\AppData\\Local\\Programs\\Common\\Microsoft\\Visual C++ for Python\\9.0\\VC\\Bin\\cl.exe' failed with exit status 2

RFE: docker runtime generic driver

It could be nice to have a generic driver that would launch a container image and expose the port to the local system so it could handle things like multiple versions (i.e: testing against stable or HEAD) without too much pain,

0.10.2 failing mysql tests with mariadb

I am getting the following errors when running tests with mariadb 10.1.16. There is no issue when running the tests with percona 5.7.13_6, so it appears to be mariadb-specific.

running testr
running=${PYTHON:-python} -m subunit.run discover -t . pifpaf/tests --list
running=${PYTHON:-python} -m subunit.run discover -t . pifpaf/tests  --load-list /tmp/tmpb9pcfj3w
running=${PYTHON:-python} -m subunit.run discover -t . pifpaf/tests  --load-list /tmp/tmp0npul3x1
running=${PYTHON:-python} -m subunit.run discover -t . pifpaf/tests  --load-list /tmp/tmp62xofra3
running=${PYTHON:-python} -m subunit.run discover -t . pifpaf/tests  --load-list /tmp/tmpol696vun
======================================================================
FAIL: pifpaf.tests.test_drivers.TestDrivers.test_mysql
tags: worker-0
----------------------------------------------------------------------
traceback-1: {{{
Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 197, in setUp
    self._setUp()
  File "/build/python-pifpaf/src/pifpaf/pifpaf/drivers/mysql.py", line 39, in _setUp
    "--datadir=" + datadir])
  File "/build/python-pifpaf/src/pifpaf/pifpaf/drivers/__init__.py", line 151, in _exec
    raise RuntimeError("Error while running command: %s" % command)
RuntimeError: Error while running command: ['mysql_install_db', '--no-defaults', '--tmpdir=/tmp/tmprguk41s_/tmp', '--datadir=/tmp/tmprguk41s_/data']

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 208, in setUp
    raise SetupError(details)
fixtures.fixture.SetupError: {}
}}}

Traceback (most recent call last):
  File "/usr/lib/python3.5/site-packages/fixtures/fixture.py", line 197, in setUp
    self._setUp()
  File "/build/python-pifpaf/src/pifpaf/pifpaf/drivers/mysql.py", line 39, in _setUp
    "--datadir=" + datadir])
  File "/build/python-pifpaf/src/pifpaf/pifpaf/drivers/__init__.py", line 151, in _exec
    raise RuntimeError("Error while running command: %s" % command)
RuntimeError: Error while running command: ['mysql_install_db', '--no-defaults', '--tmpdir=/tmp/tmprguk41s_/tmp', '--datadir=/tmp/tmprguk41s_/data']
Ran 25 tests in 3.332s
FAILED (id=0, failures=1, skips=14)
error: testr failed (1)

Running the command manually results in the following error message:

FATAL ERROR: Could not find ./bin/my_print_defaults

If you compiled from source, you need to either run 'make install' to
copy the software into the correct location ready for operation.
If you don't want to do a full install, you can use the --srcddir
option to only install the mysql database and privilege tables

If you are using a binary release, you must either be at the top
level of the extracted archive, or pass the --basedir option
pointing to that location.

The latest information about mysql_install_db is available at
https://mariadb.com/kb/en/installing-system-tables-mysql_install_db

Adding --basedir=/usr to command line fixes this.

pifpaf fails to start elasticsearch on Debian

After installing elasticsearch using debian packages, and trying to use pifpaf with it I get the following error :

tox -e py27
[snip]
ERROR [pifpaf] Program did not print: ` started'
Output: warning: Falling back to java on path. This behavior is deprecated. Specify JAVA_HOME
/usr/share/elasticsearch/bin/elasticsearch-env: line 71: /etc/default/elasticsearch: Permission denied
[snip]
ERROR:   py27: commands failed
  ls -al /etc/default/elasticsearch 
.rw-rw----  root  elasticsearch  1.5 KB  Thu Mar 21 16:39:41 2019    elasticsearch

the user used by pifpaf is not part of the elasticsearch group. Changing that (or changing the rights on the config file) solves the problem, but it would be nice to have pifpaf work out of the box in userland without any system tweaks.

(thanks for the awesome piece of software by the way ! ✨ )

Cannot start Redis 7.0 with Sentinel

It seems that pifpaf cannot start Redis 7.0 with Sentinel. Installing redis-server & redis-sentinel on Ubuntu 24.04 beta, and trying to run pifpaf results in:

(venv) root@316876421b0b:/tmp# pifpaf run redis --sentinel --
WARNING [pifpaf.util] `psutil.Popen(pid=3289, name='redis-sentinel', status='zombie', started='15:28:06')` is already gone, sending SIGKILL to its process group
ERROR [pifpaf] Program did not print: `# Sentinel (runid|ID) is'
Output: b"3289:X 18 Apr 2024 15:28:07.113 # Failed to resolve hostname 'localhost'\n\n*** FATAL CONFIG FILE ERROR (Redis 7.0.15) ***\nReading the configuration file, at line 3\n>>> 'sentinel monitor pifpaf localhost 6379 1'\nCan't resolve instance hostname.\n"

My colleague found out that it might be enough to add the following configuration line:

sentinel resolve-hostnames yes

Or alternatively, one might be able to simply use 127.0.0.1 instead of localhost on all Redis versions.

Normal Redis (without Sentinel) works.

Waits forever on etcd when using etcd 3.4

With etcd 3.4.7 the expected line "ready to serve client requests" never appears.

Instead it has the following lines:

2020-04-18 23:52:59.873615 I | embed: ready to serve client requests
2020-04-18 23:52:59.875402 N | embed: serving insecure client requests on 127.0.0.1:2379, this is strongly discouraged!

Is there a reason that etcd uses wait_for_line instead of wait_for_port? It seems like the latter would be more stable.

pip install pifpaf in ubuntu 16.04 with python 3 is broken

Steps to reproduce

On an ubuntu 16.04 docker image:

python3 -m virtualenv -p python3 /tmp/venv
source /tmp/venv/bin/activate
pip install -U pip wheel devpi-client setuptools
pip install pifpaf

The install step will throw an ascii decode error:

(venv) root@84678a3049d7:/work# pip install pifpaf
Collecting pifpaf
  Using cached pifpaf-1.10.2.tar.gz
    Complete output from command python setup.py egg_info:

    Installed /tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg
    ERROR:root:Error parsing
    Traceback (most recent call last):
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/core.py", line 111, in pbr
        attrs = util.cfg_to_args(path, dist.script_args)
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/util.py", line 249, in cfg_to_args
        pbr.hooks.setup_hook(config)
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/hooks/__init__.py", line 25, in setup_hook
        metadata_config.run()
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/hooks/base.py", line 27, in run
        self.hook()
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/hooks/metadata.py", line 26, in hook
        self.config['name'], self.config.get('version', None))
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/packaging.py", line 737, in get_version
        version = _get_version_from_pkg_metadata(package_name)
      File "/tmp/pip-build-rl5qoc1q/pifpaf/.eggs/pbr-3.1.1-py3.5.egg/pbr/packaging.py", line 705, in _get_version_from_pkg_metadata
        pkg_metadata = email.message_from_file(pkg_metadata_file)
      File "/usr/lib/python3.5/email/__init__.py", line 54, in message_from_file
        return Parser(*args, **kws).parse(fp)
      File "/usr/lib/python3.5/email/parser.py", line 54, in parse
        data = fp.read(8192)
      File "/tmp/venv/lib/python3.5/encodings/ascii.py", line 26, in decode
        return codecs.ascii_decode(input, self.errors)[0]
    UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 3106: ordinal not in range(128)
    error in setup command: Error parsing /tmp/pip-build-rl5qoc1q/pifpaf/setup.cfg: UnicodeDecodeError: 'ascii' codec can't decode byte 0xe2 in position 3106: ordinal not in range(128)

    ----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-rl5qoc1q/pifpaf/

Is there anything I'm missing?
Here is the output of pip list in that venv:

(venv) root@84678a3049d7:/work# pip list --format=columns
Package        Version
-------------- -----------
certifi        2017.7.27.1
chardet        3.0.4
check-manifest 0.35
devpi-client   3.0.0
devpi-common   3.1.0
idna           2.6
pip            9.0.1
pkg-resources  0.0.0
pkginfo        1.4.1
pluggy         0.5.2
py             1.4.34
requests       2.18.4
setuptools     36.5.0
tox            2.8.2
urllib3        1.22
virtualenv     15.1.0
wheel          0.30.0

swift master broken

i get an error. when i run gnocchi with swift master. something about swift has changed so it might not be pifpaf's fault. it may be related to: openstack/swift@4806434

DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Loaded override config for (default): ProxyOverrideOptions({}, {'sorting_method': 'shuffle', 'read_affinity': '', 'write_affinity': '', 'write_affinity_node_count': '2 * replicas', 'write_affinity_handoff_delete_count': None})
DEBUG [pifpaf.drivers.swift] swift output: <134>proxy-server: Adding required filter listing_formats to pipeline at position 5
DEBUG [pifpaf.drivers.swift] swift output: <134>proxy-server: Pipeline was modified. New pipeline is "catch_errors gatekeeper healthcheck proxy-logging cache listing_formats bulk tempurl ratelimit crossdomain container_sync tempauth staticweb copy container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server".
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Loaded override config for (default): ProxyOverrideOptions({}, {'sorting_method': 'shuffle', 'read_affinity': '', 'write_affinity': '', 'write_affinity_node_count': '2 * replicas', 'write_affinity_handoff_delete_count': None})
DEBUG [pifpaf.drivers] swift-proxy-server[12802] output: started
DEBUG [pifpaf.drivers] executing: ['swift', '-A', 'http://localhost:8080/auth/v1.0', '-V', '1.0', '-U', 'test:tester', '-K', 'testing', 'stat', '-v']
DEBUG [pifpaf.drivers.swift] swift output: <133>proxy-server: Started child 12822
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Loaded override config for (default): ProxyOverrideOptions({}, {'sorting_method': 'shuffle', 'read_affinity': '', 'write_affinity': '', 'write_affinity_node_count': '2 * replicas', 'write_affinity_handoff_delete_count': None})
DEBUG [pifpaf.drivers.swift] swift output: <134>proxy-server: Adding required filter listing_formats to pipeline at position 5
DEBUG [pifpaf.drivers.swift] swift output: <134>proxy-server: Pipeline was modified. New pipeline is "catch_errors gatekeeper healthcheck proxy-logging cache listing_formats bulk tempurl ratelimit crossdomain container_sync tempauth staticweb copy container-quotas account-quotas slo dlo versioned_writes proxy-logging proxy-server".
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Loaded override config for (default): ProxyOverrideOptions({}, {'sorting_method': 'shuffle', 'read_affinity': '', 'write_affinity': '', 'write_affinity_node_count': '2 * replicas', 'write_affinity_handoff_delete_count': None})
DEBUG [pifpaf.drivers.swift] swift output: <134>account-server: 127.0.0.1 - - [21/Sep/2017:22:42:05 +0000] "HEAD /fakedisk/802/AUTH_test" 507 - "HEAD http://localhost:8080/v1/AUTH_test?format=json" "tx46b6bb0fde854e1781735-0059c4403d" "proxy-server 12822" 0.0009 "-" 12801 -
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: ERROR Insufficient Storage 127.0.0.1:5060/fakedisk (txn: tx46b6bb0fde854e1781735-0059c4403d)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx46b6bb0fde854e1781735-0059c4403d)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [507] (txn: tx46b6bb0fde854e1781735-0059c4403d)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id tx46b6bb0fde854e1781735-0059c4403d)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: tx46b6bb0fde854e1781735-0059c4403d) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx46b6bb0fde854e1781735-0059c4403d)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx46b6bb0fde854e1781735-0059c4403d) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: tx46b6bb0fde854e1781735-0059c4403d) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx7bb258f944f34e5ebdcf1-0059c4403e)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id tx7bb258f944f34e5ebdcf1-0059c4403e)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: tx7bb258f944f34e5ebdcf1-0059c4403e) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx7bb258f944f34e5ebdcf1-0059c4403e)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx7bb258f944f34e5ebdcf1-0059c4403e) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: tx7bb258f944f34e5ebdcf1-0059c4403e) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx31452f97b62c4c7297ca6-0059c44040)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx31452f97b62c4c7297ca6-0059c44040)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id tx31452f97b62c4c7297ca6-0059c44040)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: tx31452f97b62c4c7297ca6-0059c44040) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx31452f97b62c4c7297ca6-0059c44040)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx31452f97b62c4c7297ca6-0059c44040) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: tx31452f97b62c4c7297ca6-0059c44040) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: txc88505ae53224ec595b72-0059c44044)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: txc88505ae53224ec595b72-0059c44044)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id txc88505ae53224ec595b72-0059c44044)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: txc88505ae53224ec595b72-0059c44044) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: txc88505ae53224ec595b72-0059c44044)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: txc88505ae53224ec595b72-0059c44044) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: txc88505ae53224ec595b72-0059c44044) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx084a5870e92640e8bf0a6-0059c4404c)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx084a5870e92640e8bf0a6-0059c4404c)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id tx084a5870e92640e8bf0a6-0059c4404c)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: tx084a5870e92640e8bf0a6-0059c4404c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx084a5870e92640e8bf0a6-0059c4404c)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx084a5870e92640e8bf0a6-0059c4404c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: tx084a5870e92640e8bf0a6-0059c4404c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx99de1674996d4925a3ae0-0059c4405c)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx99de1674996d4925a3ae0-0059c4405c)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User: test uses token AUTH_tkee384d51b0fb4039940b7c0516dfce6f (trans_id tx99de1674996d4925a3ae0-0059c4405c)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: User test:tester has admin authorizing. (txn: tx99de1674996d4925a3ae0-0059c4405c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: Node error limited 127.0.0.1:5060 (fakedisk) (txn: tx99de1674996d4925a3ae0-0059c4405c)
DEBUG [pifpaf.drivers.swift] swift output: <131>proxy-server: Account HEAD returning 503 for [] (txn: tx99de1674996d4925a3ae0-0059c4405c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers.swift] swift output: <135>proxy-server: removed response headers: [('X-Backend-Recheck-Account-Existence', '60')] (txn: tx99de1674996d4925a3ae0-0059c4405c) (client_ip: 127.0.0.1)
DEBUG [pifpaf.drivers] swift[12823] output: Account HEAD failed: http://localhost:8080/v1/AUTH_test 503 Service Unavailable
DEBUG [pifpaf.drivers] swift[12823] output: Failed Transaction ID: tx99de1674996d4925a3ae0-0059c4405c

ERROR [pifpaf] Traceback (most recent call last):
File "/opt/stack/gnocchi/.tox/py27-postgresql-swift/lib/python2.7/site-packages/fixtures/fixture.py", line 197, in setUp
self._setUp()
File "/opt/stack/gnocchi/.tox/py27-postgresql-swift/lib/python2.7/site-packages/pifpaf/drivers/swift.py", line 140, in _setUp
"-U", "test:tester", "-K", "testing", "stat", "-v"])
File "/opt/stack/gnocchi/.tox/py27-postgresql-swift/lib/python2.7/site-packages/pifpaf/drivers/init.py", line 283, in _exec
raise RuntimeError("Error while running command: %s" % command)
RuntimeError: Error while running command: ['swift', '-A', 'http://localhost:8080/auth/v1.0', '-V', '1.0', '-U', 'test:tester', '-K', 'testing', 'stat', '-v']

pifpaf does not support mariadb?

OS: Centos7.1

  1. pip install pifpaf
  2. yum install mariadb-server mariadb
  3. pifpaf run mysql -- mysql
    Then it post the below error.
    [root@wip-tets-gnocchi ~]# pifpaf run mysql -- mysql
    ERROR [pifpaf] Program did not print: `mysqld: ready for connections.'
    Output: 170620 1:47:07 [Note] mysqld (mysqld 5.5.52-MariaDB) starting as process 2157 ...
    170620 1:47:07 [ERROR] Fatal error: Please consult the Knowledge Base to find out how to run mysqld as root!

170620 1:47:07 [ERROR] Aborting

170620 1:47:07 [Note] mysqld: Shutdown complete

If i change user mysql to allow login, and su to mysql, then run pifpaf run mysql -- mysql.
The error is
bash-4.2$ pifpaf run mysql -- mysql
ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock' (111)
bash-4.2$ quit
bash: quit: command not found
bash-4.2$ exit
exit

Tests on Travis fail with `sequence item 1: expected a bytes-like object, str found`

Our Travis tests have started failing after we bumped pifpaf version from 1.11.2 to 1.11.4. Some more information:

  • Tests are administered using tox. They pass on local development machines.
  • We have not changed our Travis configuration aside from installing the latest libraries.

Two of our jobs fail. The first, a py36 job, fails with this error message on Travis (with some paths edited):

py36 runtests: commands[0] | pifpaf run postgresql -- python -m coverage run -m pytest tests --ignore tests/my_test.py
ERROR [pifpaf] sequence item 1: expected a bytes-like object, str found
ERROR: InvocationError: '/home/travis/build/path/to/.tox/py36/bin/pifpaf run postgresql -- python -m coverage run -m pytest tests --ignore tests/my_test.py'

The second, py27, fails with this error:

py27 runtests: commands[0] | pifpaf run postgresql -- python -m coverage run -m pytest tests --ignore tests/my_test.py
ERROR [pifpaf] Unable to run command `/usr/lib/postgresql/10/bin/pg_ctl -o '-A trust' initdb': [Errno 2] No such file or directory
ERROR: InvocationError: '/home/travis/build/path/to/.tox/py27/bin/pifpaf run postgresql -- python -m coverage run -m pytest tests --ignore tests/my_test.py'

Choose a random free port

It would be nice to have an option to choose a random free port, and the target program can read it from environment variables.

Trouble installing and running pifpaf 1.12.0

Hello, It looks like pifpaf isn't installing its dependencies when I python setup.py install it.

🔥 🚬 🚬 🚬 😮  pifpaf $ git checkout tags/1.12.0
Note: checking out 'tags/1.12.0'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

  git checkout -b <new-branch-name>

HEAD is now at c067694... Wait logging thread and close the fd
🔥 🚬 🚬 🚬 😮  pifpaf $ virtualenv venv
Using base prefix '/usr/local/Cellar/python3/3.6.2/Frameworks/Python.framework/Versions/3.6'
New python executable in /Users/samuelgarrett/workspace/tmp/pifpaf/venv/bin/python3.6
Also creating executable in /Users/samuelgarrett/workspace/tmp/pifpaf/venv/bin/python
Installing setuptools, pip, wheel...done.
🔥 🚬 🚬 🚬 😮  pifpaf $ source venv/bin/activate
(venv) 🔥 🚬 🚬 🚬 😮  pifpaf $ python setup.py install
running install
[pbr] Writing ChangeLog
[pbr] Generating ChangeLog
[pbr] ChangeLog complete (0.0s)
[pbr] Generating AUTHORS
[pbr] AUTHORS complete (0.0s)
running build
running build_py
running egg_info
writing pbr to pifpaf.egg-info/pbr.json
writing pifpaf.egg-info/PKG-INFO
writing dependency_links to pifpaf.egg-info/dependency_links.txt
writing entry points to pifpaf.egg-info/entry_points.txt
writing requirements to pifpaf.egg-info/requires.txt
writing top-level names to pifpaf.egg-info/top_level.txt
[pbr] Processing SOURCES.txt
[pbr] In git context, generating filelist from git
warning: no previously-included files found matching '.gitreview'
warning: no previously-included files matching '*.pyc' found anywhere in distribution
writing manifest file 'pifpaf.egg-info/SOURCES.txt'
running install_lib
creating /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf
copying build/lib/pifpaf/__init__.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf
copying build/lib/pifpaf/__main__.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf
creating /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/__init__.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/aodh.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/ceph.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/consul.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/couchdb.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/elasticsearch.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/etcd.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/fakes3.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/gnocchi.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/influxdb.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/kafka.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/keystone.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/memcached.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/mongodb.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/mysql.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/postgresql.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/rabbitmq.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/redis.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/s3rver.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/swift.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
creating /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates
creating /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/account.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/common.conf.inc -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/container-sync-realms.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/container.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/object.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/proxy.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/sitecustomize.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/templates/swift/swift.conf -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift
copying build/lib/pifpaf/drivers/vault.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
copying build/lib/pifpaf/drivers/zookeeper.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers
creating /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests
copying build/lib/pifpaf/tests/__init__.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests
copying build/lib/pifpaf/tests/test_cli.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests
copying build/lib/pifpaf/tests/test_drivers.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests
copying build/lib/pifpaf/tests/unkillable.py -> /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/__init__.py to __init__.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/__main__.py to __main__.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/__init__.py to __init__.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/aodh.py to aodh.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/ceph.py to ceph.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/consul.py to consul.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/couchdb.py to couchdb.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/elasticsearch.py to elasticsearch.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/etcd.py to etcd.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/fakes3.py to fakes3.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/gnocchi.py to gnocchi.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/influxdb.py to influxdb.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/kafka.py to kafka.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/keystone.py to keystone.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/memcached.py to memcached.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/mongodb.py to mongodb.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/mysql.py to mysql.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/postgresql.py to postgresql.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/rabbitmq.py to rabbitmq.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/redis.py to redis.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/s3rver.py to s3rver.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/swift.py to swift.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/templates/swift/sitecustomize.py to sitecustomize.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/vault.py to vault.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/drivers/zookeeper.py to zookeeper.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests/__init__.py to __init__.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests/test_cli.py to test_cli.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests/test_drivers.py to test_drivers.cpython-36.pyc
byte-compiling /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/tests/unkillable.py to unkillable.cpython-36.pyc
running install_egg_info
Copying pifpaf.egg-info to /Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf-1.12.0-py3.6.egg-info
running install_scripts
Installing pifpaf script to /Users/samuelgarrett/workspace/tmp/pifpaf/venv/bin
(venv) 🔥 🚬 🚬 🚬 😮  pifpaf $ pifpaf
Traceback (most recent call last):
  File "/Users/samuelgarrett/workspace/tmp/pifpaf/venv/bin/pifpaf", line 6, in <module>
    from pifpaf.__main__ import main
  File "/Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/__main__.py", line 24, in <module>
    from cliff import app
ModuleNotFoundError: No module named 'cliff'
(venv) 🔥 🚬 🚬 🚬 😮  pifpaf $ pip install cliff
Collecting cliff
Collecting PyYAML>=3.10 (from cliff)
Collecting pbr!=2.1.0,>=2.0.0 (from cliff)
  Using cached pbr-3.1.1-py2.py3-none-any.whl
Collecting cmd2>=0.6.7 (from cliff)
Collecting six>=1.10.0 (from cliff)
  Using cached six-1.11.0-py2.py3-none-any.whl
Collecting pyparsing>=2.1.0 (from cliff)
  Using cached pyparsing-2.2.0-py2.py3-none-any.whl
Collecting stevedore>=1.20.0 (from cliff)
  Using cached stevedore-1.28.0-py2.py3-none-any.whl
Collecting PrettyTable<0.8,>=0.7.1 (from cliff)
Collecting pyperclip (from cmd2>=0.6.7->cliff)
Installing collected packages: PyYAML, pbr, pyparsing, six, pyperclip, cmd2, stevedore, PrettyTable, cliff
Successfully installed PrettyTable-0.7.2 PyYAML-3.12 cliff-2.10.0 cmd2-0.7.9 pbr-3.1.1 pyparsing-2.2.0 pyperclip-1.6.0 six-1.11.0 stevedore-1.28.0
(venv) 🔥 🚬 🚬 🚬 😮  pifpaf $ pifpaf
Traceback (most recent call last):
  File "/Users/samuelgarrett/workspace/tmp/pifpaf/venv/bin/pifpaf", line 6, in <module>
    from pifpaf.__main__ import main
  File "/Users/samuelgarrett/workspace/tmp/pifpaf/venv/lib/python3.6/site-packages/pifpaf/__main__.py", line 29, in <module>
    import daiquiri
ModuleNotFoundError: No module named 'daiquiri'
(venv) 🔥 🚬 🚬 🚬 😮  pifpaf $ 

Any ideas?

Any help is appreciated. Thanks!

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.