Provided by: python-pyxs-doc_0.4.2~git20190115.97f14313-5_all 

NAME
pyxs - pyxs Documentation
.---. .-..-..-.,-. .--.
: .; `: :; :`. .'`._-.'
: ._.'`._. ;:_,._;`.__.'
: : .-. :
:_; `._.' 0.4.2-dev
-- XenStore access the Python way!
It's a pure Python XenStore client implementation, which covers all of the libxs features and adds some
nice Pythonic sugar on top. Here's a shortlist:
• pyxs supports both Python 2 and 3,
• works over a Unix socket or XenBus,
• has a clean and well-documented API,
• is written in easy to understand Python,
• can be used with gevent or eventlet.
If you have pip you can do the usual:
pip install --user pyxs
Otherwise, download the source from GitHub and run:
python setup.py install
Fedora users can install the package from the system repository:
dnf install python2-pyxs
dnf install python3-pyxs
RHEL/CentOS users can install the package from the EPEL repository:
yum install python2-pyxs
yum install python34-pyxs
Head over to our brief tutorial or, if you're feeling brave, dive right into the api; pyxs also has a
couple of examples in the examples directory.
TUTORIAL
Basics
Using pyxs is easy! The only class you need to import is Client. It provides a simple straightforward API
to XenStore content with a bit of Python's syntactic sugar here and there.
Generally, if you just need to fetch or update some XenStore items you can do:
>>> from pyxs import Client
>>> with Client() as c:
... c[b"/local/domain/0/name"] = b"Ziggy"
... c[b"/local/domain/0/name"]
b'Ziggy'
Using Client without the with statement is possible, albeit, not recommended:
>>> c = Client()
>>> c.connect()
>>> c[b"/local/domain/0/name"] = b"It works!"
>>> c.close()
The reason for preferring a context manager is simple: you don't have to DIY. The context manager will
make sure that a started transaction was either rolled back or committed and close the underlying
XenStore connection afterwards.
Connections
pyxs supports two ways of communicating with XenStore:
• over a Unix socket with UnixSocketConnection;
• over XenBus with XenBusConnection.
Connection type is determined from the arguments passed to Client constructor. For example, the following
code creates a Client instance, operating over a Unix socket:
>>> Client(unix_socket_path="/var/run/xenstored/socket_ro")
Client(UnixSocketConnection('/var/run/xenstored/socket_ro'))
>>> Client()
Client(UnixSocketConnection('/var/run/xenstored/socket'))
Use xen_bus_path argument to initialize a Client with XenBusConnection:
>>> Client(xen_bus_path="/dev/xen/xenbus")
Client(XenBusConnection('/dev/xen/xenbus'))
Transactions
Transactions allow you to operate on an isolated copy of XenStore tree and merge your changes back
atomically on commit. Keep in mind, however, that changes made within a transaction become available to
other XenStore clients only if and when committed. Here's an example:
>>> with Client() as c:
... c.transaction()
... c[b"/foo/bar"] = b"baz"
... c.commit() # !
... print(c[b"/foo/bar"])
b'baz'
The line with an exclamation mark is a bit careless, because it ignores the fact that committing a
transaction might fail. A more robust way to commit a transaction is by using a loop:
>>> with Client() as c:
... success = False
... while not success:
... c.transaction()
... c[b"/foo/bar"] = b"baz"
... success = c.commit()
You can also abort the current transaction by calling rollback().
Events
When a new path is created or an existing path is modified, XenStore fires an event, notifying all
watching clients that a change has been made. pyxs implements watching via the Monitor class. To watch a
path create a monitor monitor() and call watch() with a path you want to watch and a unique token. Right
after that the monitor will start to accumulate incoming events. You can iterate over them via wait():
>>> with Client() as c:
... m = c.monitor()
... m.watch(b"/foo/bar", b"a unique token")
... next(m.wait())
Event(b"/foo/bar", b"a unique token")
XenStore has a notion of special paths, which start with @ and are reserved for special occasions:
────────────────────────────────────────────────────────────
Path Description
────────────────────────────────────────────────────────────
@introduceDomain Fired when a new domain is introduced
to XenStore -- you can also introduce
domains yourself with a
introduce_domain() call, but in most
of the cases, xenstored will do that
for you.
────────────────────────────────────────────────────────────
@releaseDomain Fired when XenStore is no longer
communicating with a domain, see
release_domain().
┌──────────────────┬───────────────────────────────────────┐
│ │ │
--
API REFERENCE │ │ │
Client and Monitor │ │ │
--
CONTRIBUTING
Submitting a bug report
In case you experience issues using pyxs, do not hesitate to report it to the Bug Tracker on GitHub.
Setting up development environment
Writing a XenStore client library without having access to a running XenStore instance can be
troublesome. Luckily, there is a way to setup a development using VirtualBox.
1. Create a VM running Ubuntu 14.04 or later.
2. Install Xen hypervisor: sudo apt-get install xen-hypervisor-4.4-amd64.
3. Configure VM for SSH access.
4. Done! You can now rsync your changes to the VM and run the tests.
Running the tests
Only root is allowed to access XenStore, so the tests require sudo:
$ sudo python setup.py test
pyxs strives to work across a range of Python versions. Use tox to run the tests on all supported
versions:
$ cat tox.ini
[tox]
envlist = py26,py27,py34,py35,pypy
[testenv]
commands = python setup.py test
$ sudo tox
Style guide
pyxs follows Pocoo style guide. Please read it before you start implementing your changes.
PYXS CHANGELOG
Here you can see the full list of changes between each pyxs release.
Version 0.4.2-dev
• Allowed values to be empty b"". Thanks to Stephen Czetty. See PR #13 on GitHub.
Version 0.4.1
Bugfix release, released on May 11th, 2016
• Fixed a bug in XenBusConnection.create_transport which failed on attribute lookup. See PR #7 on GitHub.
Version 0.4.0
Released on March 6th, 2016
• Fixed a bug in Client.set_permissions which coerced permission lists (e.g. ["b0"]) to repr-strings
prior to validation.
• The API is now based around bytes, which means that all methods which used to accept str (or text) now
require bytes. XenStore paths and values are specified to be 7-bit ASCII, thus it makes little sense to
allow any Unicode string as input and then validate if it matches the spec.
• Removed transaction argument from Client constructor. The user is advised to use the corresponding
methods explicitly.
• Removed connection argument from Client constructor. The user should now wrap it in a Router.
• Renamed some of the Client methods to more human-readable names:
───────────────────────────────────────────
Old name New name
───────────────────────────────────────────
ls list
───────────────────────────────────────────
rm delete
───────────────────────────────────────────
get_permissions get_perms
───────────────────────────────────────────
set_permissions set_perms
───────────────────────────────────────────
transaction_start transaction
───────────────────────────────────────────
transaction_end commit and rollback
┌───────────────────┬─────────────────────┐
│ │ │
--
AUTHOR
Sergei Lebedev, Fedor Gogolev
COPYRIGHT
2011-2022, Selectel
0.4.2 Jan 31, 2022 PYXS(3)