借助Golang开发OpenStack服务的CLI
发布时间:2022-07-16 14:08:14 所属栏目:云计算 来源:互联网
导读:由于我们需要编写自己服务的客户端,之前参考过magnum的python客户端,编写过一个,整体感受就是: 一件简单的事儿,被他封装的很复杂,而且还有一个关键痛点,部署问题: 1.依赖python环境 2. 蹩脚的二进制打包方式。因此,作为一个产品的CLI,以二进制方式交
由于我们需要编写自己服务的客户端,之前参考过magnum的python客户端,编写过一个,整体感受就是: 一件简单的事儿,被他封装的很复杂,而且还有一个关键痛点,部署问题: 1.依赖python环境 2. 蹩脚的二进制打包方式。因此,作为一个产品的CLI,以二进制方式交付会带来诸多方便,比如cloud foundry也用golang重写了他的客户端部分。 基于RESTful的CLI 打造的这个CLI是RESTful的客户端, 在RESTful里面以资源(Resource)为核心,因此客户端也需要以资源的形式表现, 比如Docker的 Management Commands: 使用Golang开发OpenStack服务的CLI 该资源允许的操作:使用Golang开发OpenStack服务的CLI 因此, 轮廓上我们需要打造这样一种风格的RESTful CLI 要做成和Openstack风格类似的CLI, 在cobra的基础上我们需要加入2个组件: keystone认证: 对每一个资源的访问必须通过keystone认证才能访问, 因此认证部分是全局的。表格输出: OpenstackCLI把资源以Table的方式输出, 这个也需要单独实现。 搭建CLI架子 初始化app, 添加resourceA和resourceB使用Golang开发OpenStack服务的CLI 访问每一个resource都需要经过keystone的认证,因此认证属于一个全局都要执行的逻辑, 必须放在最前面,这里Cobra提供的一组Hook可以解决这个问题 带错误处理的Hook 当处理过程中如果产生了error可以直接return出来, 从而中断命令的继续执行, 因此认证部分我们需要这种带错误处理的Hook, 因为认证失败需要中断请求, 其次,cobra 在命令函数的执行前后分别设置了2组Hook, 执行的顺序如下: PersistentPreRunE: 无论函数 执不执行 该函数都会运行 PreRunE: 在函数执行前执行 RunE: 执行函数 PostRunE: 函数执行后执行 PersistentPostRunE: 无论函数 执不执行 该函数都会执行 利用cobra提供的PersistentPreRunE来实现验证功能使用Golang开发OpenStack服务的CLI auth函数实现认证并不难, 关键是auth过后的token 如何传递给后面的子命令使用, 参考etcdctl和docker部分都使用上下文来实现这个需求, cobra里面也没有地方给我存上下文, 因此需要专门用一个模块来保持 全局的上下文, 因此需要手动实现一个common包。使用Golang开发OpenStack服务的CLI 添加资源 为每一个资源添加5个基础的操作:get, list, create, delete, update。另起一个resourceA的包,实现这些方法,添加到子命令即可, 比如:使用Golang开发OpenStack服务的CLI 大概效果如下使用Golang开发OpenStack服务的CLI 使用效果 和使用openstack一样,你需要有一个admin_openrc 用于导入环境变量 (编辑:开发网_开封站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |