func()

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)...)
}