cloud_terrastodon_azure 0.36.0

Helpers for interacting with Azure for the Cloud Terrastodon project
use cloud_terrastodon_azure_types::PrincipalId;
use cloud_terrastodon_azure_types::RoleAssignmentScheduleRequest;
use cloud_terrastodon_azure_types::RoleDefinitionId;
use cloud_terrastodon_azure_types::RoleEligibilityScheduleId;
use cloud_terrastodon_azure_types::Scope;
use cloud_terrastodon_azure_types::uuid::Uuid;
use cloud_terrastodon_command::CacheKey;
use cloud_terrastodon_rest::RestRequest;
use eyre::Result;
use std::path::PathBuf;
use std::time::Duration;

pub async fn activate_pim_role(
    scope: &impl Scope,
    principal_id: impl Into<PrincipalId>,
    role_definition_id: RoleDefinitionId,
    role_eligibility_schedule_id: RoleEligibilityScheduleId,
    justification: String,
    duration: Duration,
) -> Result<()> {
    let scope = scope.expanded_form();
    let id = Uuid::new_v4();
    let url = format!(
        "https://management.azure.com/{scope}/providers/Microsoft.Authorization/roleAssignmentScheduleRequests/{id}?api-version=2020-10-01"
    );
    let url: &str = &url;
    RestRequest::new(http::Method::PUT, url)?
        .cache(CacheKey {
            path: PathBuf::from_iter(["az", "rest", "PUT", "roleAssignmentScheduleRequests"]),
            valid_for: Duration::ZERO,
        })
        .body(serde_json::to_string_pretty(
            &RoleAssignmentScheduleRequest::new_self_activation(
                principal_id.into(),
                role_definition_id,
                role_eligibility_schedule_id,
                justification,
                duration,
            ),
        )?)
        .receive_raw()
        .await?;
    Ok(())
}