惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

F
Fortinet All Blogs
V2EX - 技术
V2EX - 技术
The Last Watchdog
The Last Watchdog
宝玉的分享
宝玉的分享
T
Tenable Blog
WordPress大学
WordPress大学
K
Kaspersky official blog
Microsoft Security Blog
Microsoft Security Blog
大猫的无限游戏
大猫的无限游戏
H
Hackread – Cybersecurity News, Data Breaches, AI and More
Hacker News - Newest:
Hacker News - Newest: "LLM"
P
Palo Alto Networks Blog
Help Net Security
Help Net Security
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
C
CXSECURITY Database RSS Feed - CXSecurity.com
A
Arctic Wolf
Forbes - Security
Forbes - Security
Microsoft Azure Blog
Microsoft Azure Blog
爱范儿
爱范儿
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
The Cloudflare Blog
Hugging Face - Blog
Hugging Face - Blog
H
Hacker News: Front Page
W
WeLiveSecurity
博客园 - 【当耐特】
G
Google Developers Blog
Martin Fowler
Martin Fowler
TaoSecurity Blog
TaoSecurity Blog
Hacker News: Ask HN
Hacker News: Ask HN
人人都是产品经理
人人都是产品经理
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
AI
AI
N
Netflix TechBlog - Medium
C
Cisco Blogs
I
Intezer
aimingoo的专栏
aimingoo的专栏
博客园 - 聂微东
G
GRAHAM CLULEY
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
Apple Machine Learning Research
Apple Machine Learning Research
月光博客
月光博客
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
www.infosecurity-magazine.com
www.infosecurity-magazine.com
小众软件
小众软件
Blog — PlanetScale
Blog — PlanetScale
MyScale Blog
MyScale Blog
L
Lohrmann on Cybersecurity
Engineering at Meta
Engineering at Meta

OpenStack - Recent changes [en]

Meetings/NeutronDrivers - OpenStack Security Notes - OpenStack OSSN/OSSN-0098 - OpenStack User:ZlixnupTop - OpenStack OpenStack OpenStack Meetings/InfraTeamMeeting - OpenStack User:Jibzfloopgraip - OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack User:Normanroppy - OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack OpenStack Difference between revisions of "Meetings/QATeamMeeting" OpenStack Difference between revisions of "CinderMeetings" OpenStack OpenStack OpenStack User:Mufftroxkeere - OpenStack OpenStack 错误 - OpenStack User talk:Normanamoup - OpenStack User:Normanamoup - OpenStack OpenStack OpenStack OpenStack User:Vernonclife - OpenStack User:ForloveBlics - OpenStack User:RobertFap - OpenStack User:Victorbam - OpenStack User:Wompvlimdiaks - OpenStack User:EliseRose - OpenStack “Post quantum openstack”的版本间的差异 - OpenStack User:DonaldJog - OpenStack StarlingX/Containers/Applications/HowToAddNewFluxCDAppInSTX - OpenStack User:Vincentthern - OpenStack User:Robertaided - OpenStack Difference between revisions of "Meetings/InfraTeamMeeting" CinderHibiscusPTGSummary - OpenStack Difference between revisions of "CinderHibiscusPTGSummary" Difference between revisions of "Edge Computing Group" Difference between revisions of "Meetings/Nova" Difference between revisions of "Meetings/NeutronDrivers" “Python Client Library (Marconi)”的版本间的差异 - OpenStack User:JamesCence - OpenStack “StarlingX/Releases”的版本间的差异 - OpenStack “Operations/Meetups”的版本间的差异 - OpenStack “Edge Computing Group”的版本间的差异 - OpenStack User:Doramaland axola - OpenStack User:Josephhek - OpenStack User:CharlesDrapy - OpenStack User:DonaldNax - OpenStack User:Charlesjet - OpenStack User:Marioraith - OpenStack User:GustavoAburf - OpenStack “Technical Committee Tracker”的版本间的差异 - OpenStack Technical Committee Tracker - OpenStack User:HaroldNow - OpenStack User:Antoniobag - OpenStack User:Esmeraldosixq - OpenStack User:RonniAbimi - OpenStack “OSSN/OSSN-0095”的版本间的差异 - OpenStack OSSN/OSSN-0095 - OpenStack “Security Notes”的版本间的差异 - OpenStack Security Notes - OpenStack User:SoniaTed - OpenStack User:Theresalag - OpenStack User:MarieNeumn - OpenStack User:FrancesAdate - OpenStack User:JacobReaft - OpenStack User:DanielHoutt - OpenStack User:Jesseedism - OpenStack User:Esmeraldosnxi - OpenStack User:ScottLat - OpenStack User:Gribmookmaync - OpenStack User:Esmeraldoshjp - OpenStack “Manila/Meetings”的版本间的差异 - OpenStack User:Esmeraldostbd - OpenStack User:Esmeraldosfrt - OpenStack “Meetings/QATeamMeeting”的版本间的差异 - OpenStack User:Grobsnobwef - OpenStack User:Esmeraldosjoy - OpenStack User:SwhegrRib - OpenStack “ThirdPartySystems”的版本间的差异 - OpenStack “Manila”的版本间的差异 - OpenStack User:Jameswhend - OpenStack “Network/Meetings”的版本间的差异 - OpenStack “Swift/Etherpads”的版本间的差异 - OpenStack
Python Client Library (Marconi) - OpenStack
Takashi Kaji · 2026-05-02 · via OpenStack - Recent changes [en]

This document exists to establish the feel of working with the python Zaqar client. It serves as both a vision and a direction for implementors. Check out the blueprints for more details.

If you have questions, reach us at freenode.irc.net #openstack-zaqar!

Features

The client library is available on PyPI: https://pypi.python.org/pypi/python-zaqarclient/ (old version: https://pypi.python.org/pypi/python-marconiclient/ )

  • Certificate verification
  • Reauthentication on token expiration
  • Async operations
  • Full coverage of Zaqar API

Etherpads

Classes

Controllers

  • Client: handles account-wide operations - queue retrieval, etc.
  • Queue: gives access to some metadata ops, as well as message handling
  • Message: gives access to properties of message, as well as deletion
  • Claim: Collection of claimed messages - handle querying, updating, and deleting

Core

  • Connection: handles authentication with Keystone, acquires Zaqar endpoint, handles requests and networking logic

Utility

  • ErrorBase: the foundation for Zaqar client specific errors

API Synopsis

See Zaqar/specs/api/v1

Client API Synopsis

# Given the following vars defined with the following types:
# - Client:client
# - Subscriber:sub
# - Queue:queue
# - Message:message
# - Claim:claim
>>> dir(client)
['async', 'create_queue', 'home', 'queues']
>>> dir(sub)
['channels', 'listen', 'subscribe', 'unsubscribe']
>>> dir(queue)
['claim', 'delete', 'href', 'messages', 'metadata', 'name', 'post', 'stats']
>>> dir(metadata)
['content', 'reload', 'update']
>>> dir(claim)
['delete', 'grace', 'href', 'messages', 'patch', 'release', 'ttl']
>>> dir(message)
['age', 'body', 'delete', 'href', 'reload', 'status', 'ttl']

Usage

Working With a Connection

This section has been mostly simplified by the inclusion of the common lib BaseClient. What Openstack calls a "Client" we'll call a Connection. The reason for this is that the connection handles networking-level details: puts, patches, deletes, posts, etc. What we call a client is interested in higher level details, like queues and claims.

The interface is as follows, based on code reading:

    >>> # given a class zaqarclient.connection implemented using zaqarclient.common.apiclient.client
    >>> from zaqarclient import connection
    >>> conn = connection.Connection(auth_plugin=...,
                                     username='tacocat', password='queue_master')
    >>> dir(conn)
    ['client_request', 'head', 'get', 'post', 'put', 'delete', 'patch', 'get_class']

The hope is to be able to update the Http client to use enum34, detailed below. It's good enough for now, though.

See enum34 and PEP 435 for more information on Python enumerations.

Client Operation

    >>> client = Connection(async=False)
    >>> client.queues(marker=..., limit=10, detailed=False)
    <generator object <genexpr> ar 0x7fd3ef1ed730>
    >>> client.create_queue(name='wot')
    <ZaqarQueue [wot]>
    >>> client.home
    <HomeDoc ...>
    # affects all operations for objects acquired from the client
    >>> client.async
    False

Setting Up a Pub/Sub Connection

This borrows some ideas from redis-py:

    >>> sub = client.subscriber()
    >>> sub.<TAB>
    sub.channels  sub.listen    sub.subscribe    sub.unsubscribe
    >>> sub.channels
    set([])
    >>> sub.subscribe('darn_good_queue')
    >>> sub.channels
    set(['darn_good_queue'])
    >>> for msg in sub.listen():
            # blocks until a message arrives in any of the subscribed queues
            # polling implementation by default
    <Ctrl-C>
    >>> 

Queue Handling

    >>> queue = next(q for q in client.queues if q.name == 'tacocat')
    >>> queue.name
    u'tacocat'
    >>> queue.href
    u'/v1/queues/tacocat'
    >>> queue.stats
    # a dictionary derived from a JSON response
    >>> queue.messages(include_claimed=False)
    <generator object <genexpr> ar 0x7fd3ef1ed742>
    >>> queue.messages(ids=[50b68a50d6f5b8c8a7c62b01, 50b68a50d6f5b8c8a7c62b02],
                               claim=a28ee94e-6cb4-11e2-b4d5-7703267a7926, limit=1)
    <generator object <genexpr> ar 0x7fd3ef1ed742>
    >>> queue.post_messages(messages=...)
    >>> queue.metadata
    <Metadata ...>  # fetches metadata from API, returns a Metadata controller
    >>> queue.claim(limit=10)
    <Claim size:8 ...>  # size: actual number of messages received
    >>> queue.delete()

Queue Metadata Handling

    >>> meta = queue.metadata
    >>> meta.update({'max_size': 1000})  # communicate with API, replaces
    >>> meta.reload()  # gets most recent attributes from API

Message Handling

    >>> message = next(queue.messages(...))
    >>> message.age
    90
    >>> message.ttl
    120
    >>> message.href
    u'/v1/queues/darn_good_queue/messages/91wqe9bqwsbq98'
    >>> message.body
    {u'action': u'win'}
    >>> message.reload()
    >>> message.delete()
    >>> message.status
    <EnumValue: Message.Free [value=1]>

Claim Management

>>> claim = queue.claim(limit=10)
>>> claim.messages(...)
<generator object <genexpr> ar 0x7fd3ef1ed742>
>>> msg = next(claim.messages(...))
>>> msg.status
<EnumValue: Message.Claimed [value=2]>
>>> claim.href
u'/v1/queues/tacocat/claims/a28ee94e-6cb4-11e2-b4d5-7703267a7926'
>>> claim.ttl
90
>>> claim.grace
30
>>> claim.patch(ttl=..., grace=...)
>>> claim.delete()

Error Management

The wiki gives a thorough explanation of Zaqar Errors. Error handling at the client-level is a matter of transforming responses returned by Zaqar into exceptions that are meaningful to users.

Here's a quick mock up of error usage at the level of the client:

    >> error = zaqar.error.ErrorBase()
    >>> error.title
    u'...'
    >>> error.description
    u'...'
    >>> error.code
    1092
    >>> raise error
    ErrorBase (error.code): error.title
    error.description

Workflow

This section is more top-down than the rest. Consider this what it feels like to spin up python-zaqarclient in an ipython environment:

    >>> from zaqarclient.connection import Connection
    >>> from zaqarclient.client import Client
    >>> client = Connection(auth_url='https://keystone.example.com/', username='me', password='win')
    >>> client.create_queue('wot')
    >>> queue = next(client.queues())
    >>> queue.post_messages(messages=[{'event': {'data': 'winning', 'score': 10}})
    >>> message = next(queue.messages())
    >>> message.body
    {'event': {'data': 'winning', 'score': 10}}
    >>> message.status
    <Free...>
    >>> queue.stats
    {...}
    >>> claim = queue.claim(1)
    >>> message = next(claim.messages())
    >>> message.status
    <Claimed...>
    >>> message
    <Message ttl:120>
    >>> message.delete()
    >>> claim
    <Claim size:1>
    >>> claim.delete()
    >>> queue
    <Queue [wot]>
    >>> queue.delete()
    >>> client.async
    False