in internal/provider/architecture_data_source.go [58:205]
func (d *architectureDataSource) Read(ctx context.Context, req datasource.ReadRequest, resp *datasource.ReadResponse) {
var data gen.ArchitectureModel
// Read Terraform configuration data into the model
resp.Diagnostics.Append(req.Config.Get(ctx, &data)...)
if resp.Diagnostics.HasError() {
return
}
readTimeout, diags := data.Timeouts.Read(ctx, 10*time.Minute)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
ctx, cancel := context.WithTimeout(ctx, readTimeout)
defer cancel()
if d.data == nil {
resp.Diagnostics.AddError(
"architectureDataSource.Read() Provider not configured",
"The provider has not been configured. Please see the provider documentation for configuration instructions.",
)
return
}
// Use alzlib to create the hierarchy from the supplied architecture
depl := deployment.NewHierarchy(d.data.AlzLib)
if err := depl.FromArchitecture(ctx, data.Name.ValueString(), data.RootManagementGroupId.ValueString(), data.Location.ValueString()); err != nil {
resp.Diagnostics.AddError(
fmt.Sprintf("architectureDataSource.Read() Error creating architecture %s", data.Name.ValueString()),
err.Error(),
)
return
}
// Process assignPermissions overrides setting the values in the alzlib
assignPermissionsSetValues := []gen.OverridePolicyDefinitionParameterAssignPermissionsSetValue{}
resp.Diagnostics.Append(data.OverridePolicyDefinitionParameterAssignPermissionsSet.ElementsAs(
ctx,
&assignPermissionsSetValues,
false,
)...)
if resp.Diagnostics.HasError() {
return
}
for _, assignPermissionsSetValue := range assignPermissionsSetValues {
if assignPermissionsSetValue.DefinitionName.IsUnknown() || assignPermissionsSetValue.ParameterName.IsUnknown() {
continue
}
d.data.SetAssignPermissionsOnDefinitionParameter(
assignPermissionsSetValue.DefinitionName.ValueString(),
assignPermissionsSetValue.ParameterName.ValueString(),
)
}
// Process assignPermissions overrides unsetting the values in the alzlib
assignPermissionsUnsetValues := []gen.OverridePolicyDefinitionParameterAssignPermissionsUnsetValue{}
resp.Diagnostics.Append(data.OverridePolicyDefinitionParameterAssignPermissionsUnset.ElementsAs(
ctx,
&assignPermissionsUnsetValues,
false,
)...)
if resp.Diagnostics.HasError() {
return
}
for _, assignPermissionsUnsetValue := range assignPermissionsUnsetValues {
if assignPermissionsUnsetValue.DefinitionName.IsUnknown() || assignPermissionsUnsetValue.ParameterName.IsUnknown() {
continue
}
d.data.UnsetAssignPermissionsOnDefinitionParameter(
assignPermissionsUnsetValue.DefinitionName.ValueString(),
assignPermissionsUnsetValue.ParameterName.ValueString(),
)
}
// Set policy assignment defaults
defaultsMap := convertPolicyAssignmentParametersMapToSdkType(data.PolicyDefaultValues, resp)
if resp.Diagnostics.HasError() {
return
}
for defName, paramVal := range defaultsMap {
if err := depl.AddDefaultPolicyAssignmentValue(ctx, defName, paramVal); err != nil {
resp.Diagnostics.AddError(
fmt.Sprintf("architectureDataSource.Read() Error applying policy assignment default `%s`", defName),
err.Error(),
)
return
}
}
// Modify policy assignments
modifyPolicyAssignments(ctx, depl, data, resp)
if resp.Diagnostics.HasError() {
return
}
// Generate policy role assignments
policyRoleAssignments, err := depl.PolicyRoleAssignments(ctx)
if err != nil {
var praErr *deployment.PolicyRoleAssignmentErrors
as := errors.As(err, &praErr)
if !as {
resp.Diagnostics.AddError(
"architectureDataSource.Read() Error generating policy role assignments",
err.Error(),
)
return
}
if !d.data.suppressWarningPolicyRoleAssignments {
resp.Diagnostics.AddWarning(
"architectureDataSource.Read() External role assignment creation required for Azure Policy assignments.",
fmt.Sprintf("This is a known limitation, please do not raise GitHub issues!\nTo suppress this message see the provider flag: `suppress_warning_policy_role_assignments`\n\nSee `https://github.com/Azure/alzlib/issues/189`\n\n%s", praErr.Error()),
)
}
}
policyRoleAssignmentsVal, diags := policyRoleAssignmentsSetToProviderType(ctx, policyRoleAssignments.ToSlice())
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
data.PolicyRoleAssignments = policyRoleAssignmentsVal
// Set computed values
mgNames := depl.ManagementGroupNames()
mgVals := make([]gen.ManagementGroupsValue, len(mgNames))
for i, mgName := range mgNames {
mgVal, diags := alzMgToProviderType(ctx, depl.ManagementGroup(mgName))
resp.Diagnostics.Append(diags...)
mgVals[i] = mgVal
}
mgs, diags := types.ListValueFrom(ctx, gen.NewManagementGroupsValueNull().Type(ctx), &mgVals)
resp.Diagnostics.Append(diags...)
if resp.Diagnostics.HasError() {
return
}
data.ManagementGroups = mgs
// Set the id to keep ACC tests happy
data.Id = data.Name
// Save data into Terraform state
resp.Diagnostics.Append(resp.State.Set(ctx, &data)...)
}