xyz Pulumi组件提供者(Go)
这个 repo 是一个模板,展示了如何创建一个用 Go 编写的 Pulumi 组件提供者。你可以用你想要的提供者的名字搜索替换xyz ,作为为你的组件资源创建一个组件提供者的起点。
StaticPage 组件资源的例子可在provider/pkg/provider/staticPage.go 。该组件创建了一个静态网页,托管在AWS S3 Bucket中。StaticPage 并没有什么特别之处--它是一个用Go语言编写的典型的组件资源。
该组件提供者使组件资源对其他语言可用。其实现是在provider/pkg/provider/provider.go 。提供者中的每个组件资源都必须在Construct 函数中实现,以创建所请求的组件资源的实例并返回其URN 和状态(输出)。有一个初始的实现,演示了一个例子StaticPage 组件的Construct 的实现。
有一个代码生成器,它可以生成TypeScript、Python、Go和.NET的SDK,这些SDK也被检查到sdk 文件夹中。这些SDK是由schema.json 中的模式生成的。这个文件应该与组件提供者实现所支持的组件资源保持一致。
在TypeScript中使用StaticPage 组件的一个例子是在examples/simple 。
注意,生成的提供者插件(pulumi-resource-xyz)必须在你的PATH ,以便被Pulumi部署使用。如果创建了一个提供者分配给其他用户,你应该确保他们安装这个插件到他们的PATH 。
先决条件
- Go 1.15
- Pulumi CLI
- Node.js(用于构建Node.js SDK
- Yarn (用于构建Node.js SDK)
- Python 3.6+ (用于构建Python SDK)
- .NET Core SDK (用于构建.NET SDK)
构建和测试
# Build and install the provider (plugin copied to $GOPATH/bin)
make install_provider
# Regenerate SDKs
make generate
# Test Node.js SDK
$ make install_nodejs_sdk
$ cd examples/simple
$ yarn install
$ yarn link @pulumi/xyz
$ pulumi stack init test
$ pulumi config set aws:region us-east-1
$ pulumi up
命名
xyz 提供者的插件二进制文件必须命名为pulumi-resource-xyz (格式为pulumi-resource-<provider> )。
虽然提供者的插件必须遵循这个命名惯例,但SDK包的命名可以自定义。TODO解释。
示例组件
让我们更详细地看一下StaticPage 组件资源的例子。
模式
StaticPage 组件资源的例子被定义在schema.json 。
"resources": {
"xyz:index:StaticPage": {
"isComponent": true,
"inputProperties": {
"indexContent": {
"type": "string",
"description": "The HTML content for index.html."
}
},
"requiredInputs": [
"indexContent"
],
"properties": {
"bucket": {
"$ref": "/aws/v3.30.0/schema.json#/resources/aws:s3%2Fbucket:Bucket",
"description": "The bucket resource."
},
"websiteUrl": {
"type": "string",
"description": "The website URL."
}
},
"required": [
"bucket",
"websiteUrl"
]
}
}
该组件资源的类型标记是xyz:index:StaticPage ,格式为<package>:<module>:<type> 。在这种情况下,它是在xyz 包和index 模块中。这与provider/pkg/provider/staticPage.go 中NewStaticPage 的实现中传递给RegisterComponentResource 的类型令牌相同,也与provider/pkg/provider/provider.go 中Construct 所引用的令牌相同。
这个组件有一个必需的indexContent 输入属性,类型为string ,还有两个必需的输出属性:bucket 和websiteUrl 。请注意,bucket 被打造成来自aws 提供者的aws:s3/bucket:Bucket 资源(在模式中,/ 被转义为%2F )。
由于这个组件从aws 提供者那里返回一个类型,所以每个SDK都必须引用相关的Pulumiaws SDK,用于该语言。对于.NET、Node.js和Python SDK来说,依赖关系在模式的language 部分中指定。
"language": {
"csharp": {
"packageReferences": {
"Pulumi": "2.*",
"Pulumi.Aws": "3.*"
}
},
"nodejs": {
"dependencies": {
"@pulumi/aws": "^3.30.0"
},
"devDependencies": {
"typescript": "^3.7.0"
}
},
"python": {
"requires": {
"pulumi": ">=2.21.2,<3.0.0",
"pulumi-aws": ">=3.30.0,<4.0.0"
}
}
}
对于Go SDK,依赖关系在sdk/go.mod 文件中指定。
实现
该组件的实现在provider/pkg/provider/staticPage.go ,该组件的输入和输出的结构与schema.json 中定义的一致。
// The set of arguments for creating a StaticPage component resource.
type StaticPageArgs struct {
IndexContent pulumi.StringInput `pulumi:"indexContent"`
}
// The StaticPage component resource.
type StaticPage struct {
pulumi.ResourceState
Bucket *s3.Bucket `pulumi:"bucket"`
WebsiteUrl pulumi.StringOutput `pulumi:"websiteUrl"`
}
// NewStaticPage creates a new StaticPage component resource.
func NewStaticPage(ctx *pulumi.Context, name string, args *StaticPageArgs, opts ...pulumi.ResourceOption) (*StaticPage, error) {
...
}
提供者在provider/pkg/provider/provider.go 中的construct 函数中提供该组件资源。当调用construct ,并且typ 的参数是xyz:index:StaticPage ,我们创建一个StaticPage 组件资源的实例,并返回其URN 和状态。
func constructStaticPage(ctx *pulumi.Context, name string, inputs provider.ConstructInputs,
options pulumi.ResourceOption) (*provider.ConstructResult, error) {
// Copy the raw inputs to StaticPageArgs. `inputs.CopyTo` uses the types and `pulumi:` tags
// on the struct's fields to convert the raw values to the appropriate Input types.
args := &StaticPageArgs{}
if err := inputs.CopyTo(args); err != nil {
return nil, errors.Wrap(err, "setting args")
}
// Create the component resource.
staticPage, err := NewStaticPage(ctx, name, args, options)
if err != nil {
return nil, errors.Wrap(err, "creating component")
}
// Return the component resource's URN and state. `NewConstructResult` automatically sets the
// ConstructResult's state based on resource struct fields tagged with `pulumi:` tags with a value
// that is convertible to `pulumi.Input`.
return provider.NewConstructResult(staticPage)
}