-
Notifications
You must be signed in to change notification settings - Fork 4.7k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
azurerm_role_management_policy
New resource & data source
#25900
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
internal/services/authorization/parse/role_management_policy.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_data_source.go
Outdated
Show resolved
Hide resolved
internal/services/authorization/role_management_policy_resource.go
Outdated
Show resolved
Hide resolved
@manicminer I realised today I hadn't answered all your feedback. I think I have it all updated now. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hi @oWretch, thanks for circling back and making those changes. The updated buildRoleManagementPolicyForUpdate()
function looks great 👍
I've spent some time reviewing and testing, and whilst I originally had some more changes to request, once I starting digging a bit more into the APIs I realised that it would be dificult to communicate - so I've gone ahead and made some updates to get this ready, which I've summarized here:
- I noticed that the response payloads to the List operations to retrieve the policy assignments were coming in at 4-8MB each (!!). It also seems that the SDK doesn't support filtering on the
roleManagementPolicyAssignments
endpoint (presumably the API specs don't advertise it), so I reworked the resource to use only theroleManagementPolicies
endpoint (incidentally, the unfiltered List response payloads here are also in the multi-MB range, though a bit less thanroleManagementPolicyAssignments
), where we can use a$filter
query parameter to filter on the role definition ID. - Doing this brings down the List responses are to a few KB, drastically improving performance of the resource, but also means that we also need to save the role definition ID to state as part of the resource ID. I've added a custom ID type
RoleManagementPolicyId
which captures thescope
and therole_definition_id
, this enables us to perform a quick search with the newFindRoleManagementPolicyId()
function whenever we need to get the latest policy. Given that the policy ID changes every time it is modified, this also provides us with a stable resource ID. - The data source however, can continue to use the
rolemanagementpolicies.ScopedRoleManagementPolicyId
type since it does not matter if this changes at refresh time. - Validating
role_definition_id
is tricky since it seems certain role definitions (looking at management groups in particular) are not scoped at all, so the ID types validation in the SDK fails to parse these, as doesparse.RoleDefinitionId
which is used in theazurerm_role_definition
resource. Some definite inconsistency from the APIs here. I've opted to forego validation here (save for ensuring it's not empty), and I will follow up with another PR to consolidate the scattered logic around role definition IDs in theauthorization
package - else we will end up with yet another ID type to add to the confusion. - I've updated the validation for
scope
to only support management groups, subscriptions and resource groups at this time. If it becomes clear that other resource types expose role management policies, we can add support for those individually (ensuring we have test coverage as we go). - I removed the
display_name
attribute from the resource and the data source, since in my testing this doesn't actually exist and seems to be a ghost field from the API specs. - I've added test cases for subscription policies since it's important to ensure coverage for these too.
With all that said, since I've made considerable changes, and as I have been staring at this for awhile, I'm going to request a secondary review from another contributor. Pending their review, I'm happy to merge this. Thanks again for your work on this!
…liability - Introduce a custom ID type `RoleManagementPolicyId`, so we can reduce API calls and filter on the `roleManagementPolicies` endpoint. - Add test cases for role management policies on subscriptions. - Tidy up validation across the resource and data source. - Remove `display_name` attribute as this is never returned by the API.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Hey @manicminer, gave it a review and it looks good! Just had a couple comments to confirm but other than that, I think we're good!
claimValue = model.ActivationRules[0].RequireConditionalAccessContext | ||
} | ||
} else { | ||
isEnabled = false |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We could simplify this by starting with isEnabled is false
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Good shout, will tidy this up 👍
defaultRecipients = data.DefaultRecipients | ||
} | ||
if recipientChange { | ||
additionalRecipients = data.AdditionalRecipients |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Are we losing recipient information with this? We're doing quite a bit of work here and then overwriting it if recipientChange
is true. Did we want to append instead of overwrite or is this correct?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is OK, on lines 560-566 we're populating with any existing additional recipients as retrieved from the policy prior to updating, and here we're selectively replacing them if the property changed in the config (it seems they'll be removed if you just don't specify them in the Update request).
Thanks for that thorough review @manicminer. And I agree with your sentiments - the Azure API for role management could be far better than it is. One might think three versions would be enough to sort some of that out 🙂 |
<Actions> <action id="f410411e63aff4bb73a81c2aec1d373cf8a903e63b30dee2006b0030d8a94cc8"> <h3>Bump Terraform `azurerm` provider version</h3> <details id="1d9343c012f5434ac9fe8a98135bae3667b399259be16d9b14302ea3bd424a24"> <summary>Update Terraform lock file</summary> <p>changes detected:
	"hashicorp/azurerm" updated from "3.107.0" to "3.108.0" in file ".terraform.lock.hcl"</p> <details> <summary>3.108.0</summary> <pre>Changelog retrieved from:
	https://github.com/hashicorp/terraform-provider-azurerm/releases/tag/v3.108.0
FEATURES:

* **New Data Source:** `azurerm_role_management_policy` ([#25900](hashicorp/terraform-provider-azurerm#25900 **New Resource:** `azurerm_role_management_policy` ([#25900](https://github.com/hashicorp/terraform-provider-azurerm/issues/25900))

ENHANCEMENTS:

* provider: support subscription ID hinting when using Azure CLI authentication ([#26282](hashicorp/terraform-provider-azurerm#26282 `serviceconnector`: updating to use API Version `2024-04-01` ([#26248](hashicorp/terraform-provider-azurerm#26248 `azurerm_container_groups` - can now be created with a User Assigned Identity when running Windows ([#26308](hashicorp/terraform-provider-azurerm#26308 `azurerm_kubernetes_cluster` - updating the `network_profile.network_policy` property to `azure` and `calico` when it hasn't been previously set is supported ([#26176](hashicorp/terraform-provider-azurerm#26176 `azurerm_kubernetes_cluster` - respect Pod Distruption Budgets when rotating the `default_node_pool` ([#26274](hashicorp/terraform-provider-azurerm#26274 `azurerm_lb_backend_address_pool` - support for the `synchronous_mode` property ([#26309](hashicorp/terraform-provider-azurerm#26309 `azurerm_private_endpoint` - support symultaneous creation of multiple resources of this type per subnet ([#26006](https://github.com/hashicorp/terraform-provider-azurerm/issues/26006))

BUG FIXES:

* `azurerm_express_route_circuit_peering`, `azurerm_express_route_circuit`, `azurerm_express_route_gateway`, `azurerm_express_route_port` - split create and update ([#26237](hashicorp/terraform-provider-azurerm#26237 `azurerm_lb_backend_address_pool_address` - when using this resource, values are no longer reset on `azurerm_lb_backend_address_pool` ([#26264](hashicorp/terraform-provider-azurerm#26264 `azurerm_route_filter` - spliting create and update so lifecycle ignore changes works correctly ([#26266](hashicorp/terraform-provider-azurerm#26266 `azurerm_route_server` - spliting create and update so lifecycle ignore changes works correctly ([#26266](hashicorp/terraform-provider-azurerm#26266 `azurerm_synapse_workspace` - updates the client used in all operations of `azurerm_synapse_workspace_sql_aad_admin` to prevent this resource from modifying the same resource as `azurerm_synapse_workspace_aad_admin` ([#26317](hashicorp/terraform-provider-azurerm#26317 `azurerm_virtual_network` - correctly parse network securty group IDs ([#26283](https://github.com/hashicorp/terraform-provider-azurerm/issues/26283))

DEPRECATIONS:

* Data Source: `azurerm_network_interface` - the `enable_ip_forwarding` and `enable_accelerated_networking` properties have been deprecated and superseded by the `ip_forwarding_enabled` and `accelerated_networking_enabled` properties ([#26293](hashicorp/terraform-provider-azurerm#26293 `azurerm_api_management` - the `policy` block has been deprecated is superseded by the `azurerm_api_management_policy` resource ([#26305](hashicorp/terraform-provider-azurerm#26305 `azurerm_kubernetes_cluster` - the `ebpf_data_plane` property has been deprecated and superseded by the `network_data_plane` property ([#26251](hashicorp/terraform-provider-azurerm#26251 `azurerm_network_interface` - the `enable_ip_forwarding` and `enable_accelerated_networking` properties have been deprecated and superseded by the `ip_forwarding_enabled` and `accelerated_networking_enabled` properties ([#26293](hashicorp/terraform-provider-azurerm#26293 `azurerm_synapse_workspace` - the `aad_admin` and `sql_aad_admin` blocks have been deprecated and superseded by the `azurerm_synapse_workspace_aad_admin` and `azurerm_synapse_workspace_sql_aad_admin` resources ([#26317](https://github.com/hashicorp/terraform-provider-azurerm/issues/26317))


</pre> </details> </details> <a href="https://infra.ci.jenkins.io/job/updatecli/job/azure/job/main/244/">Jenkins pipeline link</a> </action> </Actions> --- <table> <tr> <td width="77"> <img src="https://www.updatecli.io/images/updatecli.png" alt="Updatecli logo" width="50" height="50"> </td> <td> <p> Created automatically by <a href="https://www.updatecli.io/">Updatecli</a> </p> <details><summary>Options:</summary> <br /> <p>Most of Updatecli configuration is done via <a href="https://www.updatecli.io/docs/prologue/quick-start/">its manifest(s)</a>.</p> <ul> <li>If you close this pull request, Updatecli will automatically reopen it, the next time it runs.</li> <li>If you close this pull request and delete the base branch, Updatecli will automatically recreate it, erasing all previous commits made.</li> </ul> <p> Feel free to report any issues at <a href="https://github.com/updatecli/updatecli/issues">github.com/updatecli/updatecli</a>.<br /> If you find this tool useful, do not hesitate to star <a href="https://github.com/updatecli/updatecli/stargazers">our GitHub repository</a> as a sign of appreciation, and/or to tell us directly on our <a href="https://matrix.to/#/#Updatecli_community:gitter.im">chat</a>! </p> </details> </td> </tr> </table> Co-authored-by: Jenkins Infra Bot (updatecli) <60776566+jenkins-infra-bot@users.noreply.github.com>
This is awesome! But is it fair to assume that it is currently not possible to provision |
@celsocoutinho-tangany Currently yes, the resource only supports management group, subscription or resource group level. We had some challenging API interactions when trying to scope more specifically than that. I'll try to get those resolved in time, once the current implementation of this resource has had a break-in period to weed out any bugs. |
I'm going to lock this pull request because it has been closed for 30 days ⏳. This helps our maintainers find and focus on the active contributions. |
Community Note
Description
Add support for managing the policies for PIM assignments to Azure resources. Based on the work in hashicorp/terraform-provider-azuread#1327.
Closes #23295 as this has not been updated for 7 months and has merge conflicts with main. I also thought code consistency would be nice between providers. Also closes #20496.
Fixes #19912, fixes #22766, fixes #23458, fixes hashicorp/terraform-provider-azuread#1186
PR Checklist
Changes to existing Resource / Data Source
Testing
Change Log
Below please provide what should go into the changelog (if anything) conforming to the Changelog Format documented here.
azurerm_role_management_policy
- new resource [azurerm_role_management_policy
New resource & data source #25900]azurerm_role_management_policy
- new data source [azurerm_role_management_policy
New resource & data source #25900]This is a (please select all that apply):