摘要: 本文主要向大家展示如何为阿里云 Terraform Provider 贡献自己的力量,帮助开发者和志同道合的朋友尽快加入到开源生态的建设中来。 本文面向所有的对Terraform熟悉和感兴趣的朋友,如果您还不了解Terraform,快快戳这里。
本文主要向大家展示如何为阿里云 Terraform Provider 贡献自己的力量,帮助开发者和志同道合的朋友尽快加入到开源生态的建设中来。
本文面向所有的对Terraform熟悉和感兴趣的朋友,如果您还不了解Terraform,快快戳这里。
本文会从环境搭建和开发规范两个方面向大家展示如何开放 terraform provider。
本地安装go >1.10.0 详见:https://golang.org/dl/
本地安装 Terraform > 0.11, 详见: https://www.terraform.io/intro/getting-started/install.html
fork 并下载 repo: https://github.com/alibaba/terraform-provider
cd $GOPATH
mkdir -p src/github.com/alibaba
cd $GOPATH/src/github.com/alibaba
git clone git clone [email protected]:/terraform-provider.git
利用 glide 安装依赖(how to install glide)
# switch to project
cd $GOPATH/src/github.com/alibaba/terraform-provider
# get all dependencies and install modules
glide up
设置环境变量,省去每次测试时输入AK的要求
# set the creds
export ALICLOUD_ACCESS_KEY="***"
export ALICLOUD_SECRET_KEY="***"
Resource 开发是根据阿里云的OpenAPI在terraform provider中实现对阿里云产品和资源的插件。
每个Resource的实现不是根据阿里云帮助文档对OpenAPI的简单调用,要对产品的设计,功能以及使用有较深的理解,通常遵循如下设计原则:
availability_zone
, load_balancer_id
.参数校验
有些参数需要做一些简单的校验,提前提醒客户使用正确的可选值。除此之外,对于某些参数,要做diff判断,以自动屏蔽某些不起作用的参数,如:对于ECS而言,选择PostPaid
,意味着所有与PrePaid
相关的参数 period
,period_unit
,renewal_status
,auto_renew_period
都将失效,具体表现为在执行terraform plan
的时候,这些参数不会做diff比较。
每个Resource需要实现Create,Read,Update,Delete,Import五个功能:
Create
Update
d.Partial(true)
,并在每步修改后进行时时更新,如d.SetPartial("bandwidth")
,以保证后面的每一步成功的更改都能被及时的写入到state 文件中。Read
Delete
Import
执行terraform 命令,完成对资源的管理,主要命令包含以下几个:
Read
方法来获取模板中定义的资源。如果资源尚未创建,及当前目录下的state文件为空,直接展示即将创建的资源,否则展示要变更的资源terrform apply
实现对资源的创建和更新。新资源调用Create
,已有资源调用Update
完成对资源的修改。
terraform destroy
调用Destroy
完成对资源的销毁。
Read
方法完成对已有资源的导入,将已有资源加入到terraform的管理序列中来。但要注意,由于已有资源不一定是通过terraform创建的,所有导入成功后,记得运行terraform plan
进行对比,手动补齐模板。Data Source 开发是调用阿里云资源的查询API完成对特定资源的查询和展示。
每个Data Source的实现要根据API的字段和资源属性,为用户提供更好的查询体验,最好可以支持模糊查询。参数设计原则除了与Resource设计原则类似外,还应该提供一个参数output_file
来将查询到的结果输出到文件中,供用户参考。
每个Data Source只需实现Read方法,该方法用来查询并过滤符合条件的所有的resource,然后将过滤的结果以列表的方式展示出来。在具体实现过程中,需要注意以下几点:
在完成模块开发后,要对每个resource和data source的功能进行测试,测试的方法是编写对应的测试用例。
测试用例的编写要遵循以下几个原则:
如何运行测试用例
以ECS instance 举例,运行如下的测试命令,可以实现对目录alicloud
下所有以TestAccAlicloudInstance
为前缀的测试用例的运行:
TF_ACC=1 go test ./alicloud -v -run=TestAccAlicloudInstance -timeout=300m
其中,timeout
表示这个测试用例运行的超时时长。
如果想要精确到具体的测试用例,补全测试用例的名称即可。
文档是用户使用provider的基础,文档的编写非常重要,需遵循如下几个原则:
Note
website/docs/r
下,data source 文档放在目录website/docs/d
下。每新增一个文档,要修改文件website/alicloud.erb
来完成侧边栏展示为了更好的帮助用户使用新增的resource,在完成以上工作后,需要为当前的这个resource或者当前这类resource增加一个example,来指导用户编写对应的模板。该样例是一个真实的可运行的模板,通常包含以下四部分:
完成了以上功能的实现和代码的编写后,接下来最关键的就是代码的提交,我们的代码最好优先提交到dev
分支,具体的步骤分为以下几步:
为了避免出现代码的错乱,降低review的复杂度,Commit要细化,每一功能点或者一次的修改(不论改动有多小)对应一个Commit。为了防止功能和代码的相互冲突,每个功能点对应一个branch。
提交代码前一定要Rebase
,具体操作步骤如下:
origin
指向了你的fork: $ git remote -v
origin [email protected]:YOUR_GITHUB_USERNAME/terraform-provider.git (fetch)
origin [email protected]:YOUR_GITHUB_USERNAME/terraform-provider.git (push)
接着,将主仓库配置为你的remote,如起名为“alicloud”
$ git remote add alicloud https://github.com/alibaba/terraform-provider.git
$ git remote -v
origin [email protected]:YOUR_GITHUB_USERNAME/terraform-provider.git (fetch)
origin [email protected]:YOUR_GITHUB_USERNAME/terraform-provider.git (push)
alicloud https://github.com/alibaba/terraform-provider.git (fetch)
alicloud https://github.com/alibaba/terraform-provider.git (push)
检查当前仓库的状态
$ git status
On branch YOUR_BRANCH
Your branch is up-to-date with 'origin/YOUR_BRANCH'.
nothing to commit, working tree clean
$ git pull --rebase alicloud dev
如果有冲突,解决冲突后继续 rebase,直到所有冲突都解决,之后再次检查状态:
$ git status
On branch YOUR_BRANCH
Your branch and 'origin/YOUR_BRANCH' have diverged,
and have 4 and 1 different commits each, respectively.
(use "git pull" to merge the remote branch into yours)
nothing to commit, working tree clean
$ git push origin
如遇到提交失败,可使用-f
或者--force
来强制提交
Submitting Your Pull Request
完成代码上传后,在Github控制台将你的代码提交到主仓库的dev
分支,并对PR做一个简单的描述和介绍。
$ git reset HEAD^1
Unstaged changes after reset:
xxxxx
之后,stash并利用rebase下载最新的代码,以避免不必要的冲突:
$ git stash
Saved working directory and index state WIP on YOUR_BRANH: xxxxx
HEAD is now at xxxxx
# rebase 下载最新代码
$ git pull --rebase alicloud dev
rebase顺利执行之后,恢复stash代码:
$ git stash pop
On branch YOUR_BRANCH
Changes not staged for commit:
xxxxx
根据review意见,继续修改代码,之后再次进行代码commit,rebase和push即可。
本文主要讲述了如何为阿里云的Terraform-Provider贡献代码的一些流程和注意事项,欢迎大家积极加入到Terraform Provider的建设中来,谢谢大家。
原文链接
本文为云栖社区原创内容,未经允许不得转载