Terraform自定义提供商 - 数据源架构
我正在使用Terraform SDK创建自定义Terraform提供商。我正在尝试从现有API获取呼叫中读取数据。我发现很难将JSON响应从API映射到Terraform模式。这是我的数据源架构:
func dataSourceProjects() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceProjectsRead,
Schema: map[string]*schema.Schema{
"members": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"owners": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
},
}
}
这是API JSON响应:
{
"members": [
"test12",
"test8800",
"test0032",
"test1234"
],
"owners": [
"test000",
"test111",
"test12",
"test1234"
]
}
这是我的数据源读取功能,
func dataSourceProjectsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := &http.Client{Timeout: 10 * time.Second}
// Warning or errors can be collected in a slice type
var diags diag.Diagnostics
req, err := http.NewRequest("GET", fmt.Sprintf("%s/test/team", "https://myurl/v1"), nil)
req.Header.Add("Authorization", "Bearer xxxxx")
if err != nil {
return diag.FromErr(err)
}
r, err := client.Do(req)
if err != nil {
return diag.FromErr(err)
}
defer r.Body.Close()
members := make([]string, 0)
err = json.NewDecoder(r.Body).Decode(&members)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("members", members); err != nil {
return diag.FromErr(err)
}
// always run
d.SetId(strconv.FormatInt(time.Now().Unix(), 10))
return diags
}
我一直遇到此错误:
错误:JSON:无法将type []字符串
的GO值汇总到GO值中
I am working on creating a custom terraform provider by using terraform sdk. I am trying to read data from the existing API GET call. I am finding it difficult to map the JSON response from an API to terraform schema. This is my data source schema:
func dataSourceProjects() *schema.Resource {
return &schema.Resource{
ReadContext: dataSourceProjectsRead,
Schema: map[string]*schema.Schema{
"members": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
"owners": &schema.Schema{
Type: schema.TypeList,
Elem: &schema.Schema{Type: schema.TypeString},
Computed: true,
},
},
}
}
This is the API JSON response:
{
"members": [
"test12",
"test8800",
"test0032",
"test1234"
],
"owners": [
"test000",
"test111",
"test12",
"test1234"
]
}
This is my Data source read function
func dataSourceProjectsRead(ctx context.Context, d *schema.ResourceData, m interface{}) diag.Diagnostics {
client := &http.Client{Timeout: 10 * time.Second}
// Warning or errors can be collected in a slice type
var diags diag.Diagnostics
req, err := http.NewRequest("GET", fmt.Sprintf("%s/test/team", "https://myurl/v1"), nil)
req.Header.Add("Authorization", "Bearer xxxxx")
if err != nil {
return diag.FromErr(err)
}
r, err := client.Do(req)
if err != nil {
return diag.FromErr(err)
}
defer r.Body.Close()
members := make([]string, 0)
err = json.NewDecoder(r.Body).Decode(&members)
if err != nil {
return diag.FromErr(err)
}
if err := d.Set("members", members); err != nil {
return diag.FromErr(err)
}
// always run
d.SetId(strconv.FormatInt(time.Now().Unix(), 10))
return diags
}
I keep getting this error:
Error: json: cannot unmarshal object into Go value of type []string
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
server.go
data_source_projects.go
输出:
server.go
data_source_projects.go
Output:
正如马特(Matt)和错误代码所提到的那样,您正在尝试将身体勾勒出不适当的结构。
基本上,您的体内没有数组,您的对象具有带有一系列字符串的字段。
您的拆卸方式将适用于诸如
试图按照下面进行解码之类的身体,因此请使用具有显式映射的结构。
Just as Matt and the error code mentioned, you're trying to unmarshal your body to an improper struct.
Basically, you don't have an array in the Body, you have an object with fields that have an array of strings.
Your way of unmarshalling would work for bodies like
Try to decode it as below, so use a struct with explicit mapping.