Source code for pyxs._internal

# -*- coding: utf-8 -*-
"""
    pyxs._internal
    ~~~~~~~~~~~~~~

    A place for secret stuff, not available in the public API.

    :copyright: (c) 2011 by Selectel, see AUTHORS for more details.
"""

from __future__ import unicode_literals

__all__ = ["Event", "Op", "Packet"]

import struct
from collections import namedtuple

from .exceptions import InvalidOperation, InvalidPayload


#: Operations supported by XenStore.
Operations = Op = namedtuple("Operations", [
    "DEBUG",
    "DIRECTORY",
    "READ",
    "GET_PERMS",
    "WATCH",
    "UNWATCH",
    "TRANSACTION_START",
    "TRANSACTION_END",
    "INTRODUCE",
    "RELEASE",
    "GET_DOMAIN_PATH",
    "WRITE",
    "MKDIR",
    "RM",
    "SET_PERMS",
    "WATCH_EVENT",
    "ERROR",
    "IS_DOMAIN_INTRODUCED",
    "RESUME",
    "SET_TARGET",
    "RESTRICT"
])(*(list(range(20)) + [128]))


Event = namedtuple("Event", "path token")


[docs]class Packet(namedtuple("_Packet", "op rq_id tx_id size payload")): """A single message to or from XenStore. :param int op: an item from :data:`Op`, representing operation, performed by this packet. :param bytes payload: packet payload, should be a valid ASCII-string with characters between ``[0x20;0x7f]``. :param int rq_id: request id -- hopefuly a **unique** identifier for this packet, XenStore simply echoes this value back in reponse. :param int tx_id: transaction id, defaults to ``0`` -- which means no transaction is running. """ #: ``xsd_sockmsg`` struct see ``xen/include/public/io/xs_wire.h`` #: for details. _struct = struct.Struct(b"IIII") def __new__(cls, op, payload, rq_id=None, tx_id=None): # Checking restrictions: # a) payload is limited to 4096 bytes. if len(payload) > 4096: raise InvalidPayload(payload) # b) operation requested is present in ``xsd_sockmsg_type``. if op not in Op: raise InvalidOperation(op) return super(Packet, cls).__new__(cls, op, rq_id or 0, tx_id or 0, len(payload), payload)