in internal/services/azapi_resource_data_source.go [214:300]
func (r *AzapiResourceDataSource) Read(ctx context.Context, request datasource.ReadRequest, response *datasource.ReadResponse) {
var model AzapiResourceDataSourceModel
if response.Diagnostics.Append(request.Config.Get(ctx, &model)...); response.Diagnostics.HasError() {
return
}
readTimeout, diags := model.Timeouts.Read(ctx, 5*time.Minute)
response.Diagnostics.Append(diags...)
if response.Diagnostics.HasError() {
return
}
ctx, cancel := context.WithTimeout(ctx, readTimeout)
defer cancel()
var id parse.ResourceId
resourceType := model.Type.ValueString()
azureResourceType, _, _ := utils.GetAzureResourceTypeApiVersion(resourceType)
if name := model.Name.ValueString(); len(name) != 0 {
parentId := model.ParentID.ValueString()
if parentId == "" && strings.EqualFold(azureResourceType, arm.ResourceGroupResourceType.String()) {
parentId = fmt.Sprintf("/subscriptions/%s", r.ProviderData.Account.GetSubscriptionId())
}
buildId, err := parse.NewResourceID(name, parentId, resourceType)
if err != nil {
response.Diagnostics.AddError("Invalid configuration", err.Error())
return
}
id = buildId
} else {
resourceId := model.ResourceID.ValueString()
if resourceId == "" && strings.EqualFold(azureResourceType, arm.SubscriptionResourceType.String()) {
resourceId = fmt.Sprintf("/subscriptions/%s", r.ProviderData.Account.GetSubscriptionId())
}
buildId, err := parse.ResourceIDWithResourceType(resourceId, resourceType)
if err != nil {
response.Diagnostics.AddError("Invalid configuration", err.Error())
return
}
id = buildId
}
ctx = tflog.SetField(ctx, "resource_id", id.ID())
// Ensure the context deadline has been set before calling ConfigureClientWithCustomRetry().
client := r.ProviderData.ResourceClient.ConfigureClientWithCustomRetry(ctx, model.Retry, false)
responseBody, err := client.Get(ctx, id.AzureResourceId, id.ApiVersion, clients.NewRequestOptions(AsMapOfString(model.Headers), AsMapOfLists(model.QueryParameters)))
if err != nil {
if utils.ResponseErrorWasNotFound(err) {
response.Diagnostics.AddError("Resource not found", fmt.Errorf("resource %q not found", id).Error())
return
}
response.Diagnostics.AddError("Failed to retrieve resource", fmt.Errorf("retrieving resource %q: %+v", id, err).Error())
return
}
model.ID = basetypes.NewStringValue(id.ID())
model.Name = basetypes.NewStringValue(id.Name)
model.ParentID = basetypes.NewStringValue(id.ParentId)
model.ResourceID = basetypes.NewStringValue(id.AzureResourceId)
if bodyMap, ok := responseBody.(map[string]interface{}); ok {
model.Tags = tags.FlattenTags(bodyMap["tags"])
model.Location = basetypes.NewStringNull()
if v := bodyMap["location"]; v != nil {
model.Location = basetypes.NewStringValue(location.Normalize(v.(string)))
}
model.Identity = basetypes.NewListNull(identity.Model{}.ModelType())
if v := identity.FlattenIdentity(bodyMap["identity"]); v != nil {
model.Identity = identity.ToList(*v)
}
}
var defaultOutput interface{}
if !r.ProviderData.Features.DisableDefaultOutput {
defaultOutput = id.ResourceDef.GetReadOnly(responseBody)
defaultOutput = utils.RemoveFields(defaultOutput, volatileFieldList())
}
output, err := buildOutputFromBody(responseBody, model.ResponseExportValues, defaultOutput)
if err != nil {
response.Diagnostics.AddError("Failed to build output", err.Error())
return
}
model.Output = output
response.Diagnostics.Append(response.State.Set(ctx, &model)...)
}