如何在Terraform插件中配置多后端客户端(Kafka主题+Schema)
解决方案
要让Terraform Provider的Configure函数同时返回Schema和Topic客户端,你需要创建一个封装两个客户端的结构体,将其作为统一的数据源传递给资源和数据源。
步骤1:定义封装客户端的结构体
在provider.go中新增一个结构体,用来同时持有Schema和Topic客户端:
// ProviderClient 封装Schema和Topic客户端,供资源/数据源使用 type ProviderClient struct { SchemaClient *ClientSchema TopicClient *ClientTopic }
步骤2:修改Configure函数返回封装后的结构体
更新Configure逻辑,将两个客户端注入到ProviderClient实例中,再赋值给resp.ResourceData和resp.DataSourceData:
func (p *RedPandaProvider) Configure(ctx context.Context, req provider.ConfigureRequest, resp *provider.ConfigureResponse) { var data RedPandaProviderModel resp.Diagnostics.Append(req.Config.Get(ctx, &data)...) if resp.Diagnostics.HasError() { return } apiURL := data.SchemaApiUrl.ValueString() bootstrapServers := data.BootstrapServers.String() schemaClient := NewClientSchema(apiURL) topicClient := NewClientTopic(bootstrapServers) // 初始化封装结构体 providerClient := &ProviderClient{ SchemaClient: schemaClient, TopicClient: topicClient, } // 将封装后的客户端传递给资源和数据源 resp.DataSourceData = providerClient resp.ResourceData = providerClient }
步骤3:在资源中使用对应客户端
在Schema资源的CRUD函数中,通过类型断言获取Schema客户端:
func resourceSchemaCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client := meta.(*ProviderClient) schemaClient := client.SchemaClient // 执行Schema创建逻辑 // ... return nil }
在Topic资源的CRUD函数中,同理获取Topic客户端:
func resourceTopicCreate(ctx context.Context, d *schema.ResourceData, meta interface{}) diag.Diagnostics { client := meta.(*ProviderClient) topicClient := client.TopicClient // 执行Topic创建逻辑 // ... return nil }
内容的提问来源于stack exchange,提问作者Mark Olliver
相关产品推荐
相关产品推荐

