分布式测试平台构思

构思:salt + redis 结合一个python web framework来做 参考项目: saltobserver 用flask搭建用来展示salt redis returner的结果,采用gevent实时从redis里获取数据并发送给websocket client. 最初我想使用asyncio,我看到asyncio可以很方便的和tornaodo结合起来

from tornado.platform.asyncio import AsyncIOMainLoop

def main():
    tornado.options.parse\_config\_file("config.py")
    tornado.options.parse\_command\_line()
    AsyncIOMainLoop().install()
    application = Application()
    application.listen(options.port)
    loop = asyncio.get\_event\_loop()
    try:
        loop.run_forever()
    except KeyboardInterrupt:
        pass
    finally:
        loop.close()

tornado-redis 作者说如果使用redis pubsub推荐用他这个项目,项目的demo里有个sockjs demo 展示了如何使用tornado-redis构建公共聊天网站。 demo里用到了sockjs-tornado,然而这个是为了结合socketjs来使用的,也就是说同时处理一般的http请求和websocket,我并不考虑向下兼容的问题,那么

subscriber = tornadoredis.pubsub.SockJSSubscriber(tornadoredis.Client()) 

这个tornadoredis.pubsub.SockJSSubscriber类我是否用得到呢?这只是一个包装类,继承自BaseSubscriber重写了on_message发送广播给subscribers。
看来用不到,那么我大概可以用SocketIOSubscriber在tornado.websocket.WebSocketHandler处理subscribe,unsubscribe,重写on_message就好了。

原本我想使用asyncio同时我可以使用asyncio-redis 这样我web framework我可以用更简单的aiohttp,然而当我在服务器上测试用salt client发送指令时发现并不能兼容python3 https://github.com/saltstack/salt/issues/24750 那么综合下来可供我使用的有哪些呢
由于salt client暂时不支持python3,也就无法使用asyncio,aiohttp,那么我先用tornado这样以后支持也很方便切换过来。
SocketIOSubscriber的on_message会调用subscriber的on_message也就是在Handler里on_message,那么SocketIOSubscriber的on_message什么时候调用呢?当redis里有了新消息时。


今天是10月8日,昨天的雾霾消散了。发布这篇文章有一个多月了,这个构思走到了第一个版本,我把它放在了github,下面是预览。

assassin_preview

https://github.com/bung87/assassin 项目名称用了一款我喜爱的游戏的名字《刺客信条》。用两台机器配置了saltstack查看各种命令返回的数据结构,然后找来一些库解析结果,实现功能,尚未在正式环境跑过。 只有ping大致的做了数据可视化,用raphel.js实现了动画效果,然后包含ping,dig,traceroute都做了基本的表格形式的数据展示。 traceroute这个功能应该是选择一个节点去测试,由于兴趣也不是很浓,没做到这一步。 任务用jquery的deffered实现任务状态的更新,基于socket实现实时的客户端任务状态更新,完成了process状态的实现,需要根据任务开始前确定可用节点,及任务结束后确定返回结果的节点,设置超时,对比节点响应数等,这部分没做。