接入一个云
介绍如何接入一个新的云平台,假设这里要接入的云为测试云(TestCloud)。
基础概念
-
平台名称
- 每接入一个云,都需要定义一个云平台的名称,Provider 这里是目前已经接入的各个云的名称
- 这里说明下腾讯云的名称Qcloud, 本身最好的定义是 TencentCloud, 但最早登录时用的控制台地址是 https://qcloud.com, 所以才定义为Qcloud
-
资源接口
-
云账号接入
- 云账号接入类似于资源接口, 接口定义在ICloudProvider, 需要实现ICloudProviderFactory和ICloudProvider
- ICloudProviderFactory 是校验云账号及云账号属性的接口
- ICloudProvider 是云账号真正获取及操作云平台资源的入口
- 云账号接入的实现文件对应路径应该在 pkg/multicloud/testcloud/provider/ 中
-
快捷操作
testcli 调试命令
- 创建 pkg/multicloud/testcloud/test.go 文件
- 定义 STestCloudClient 结构体, 用于保存 aksk
- 实现 NewTestCloudClient 方法, 此方法需要验证测试云的 aksk 是否正确, 并返回*STestCloudClient
- 创建 pkg/multicloud/testcloud/region.go 并定义 SRegion 结构体,实现 GetClient 方法
- 实现绑定 GetRegions 方法到 STestCloudClient, 私有云 region 一般是模拟的, 可以找已经试下的私有云参考
tip
在接入过程中需要用到一次错误的aksk,根据返回的错误信息,将错误转换为 cloudprovider.ErrInvalidAccessKey 错误, 用以区分错误类型
-
创建 pkg/multicloud/testcloud/shell/region.go
- 实现 region-list 命令, 可参考 pkg/multicloud/aliyun/shell/region.go
-
创建 cmd/testcli/main.go 文件
- 实现命令调试的入口, 可参考 cmd/aliyuncli/main.go
调试 region-list 命令
# 编译testcli二进制文件
$ make cmd/testcli
# 通过命令调试接口
$ ./_output/bin/testcli --debug region-list
tip
- 在对接各个云平台时,一般云平台会提供对应的 golang sdk,这里尽量仅使用提供的 sdk 的认证部分, 其余部分可通过 REST API 文档自行设计, 这样做有以下好处
- 摆脱 golang sdk 限制
- 可以统一处理 err 错误,例如后面要用到的 cloudprovider.ErrNotFound 错误
- 方便实现云账号只读同步及代理
- 轻量, 部分云平台的 sdk 用了大量指针, 仅仅指针判断会增加很多不必要的代码