use crate::{CloudClient, Result};
use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum PrincipalType {
AwsAccount,
Organization,
OrganizationUnit,
IamRole,
IamUser,
ServicePrincipal,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkCreateRequest {
pub share_name: String,
pub principal: String,
#[serde(rename = "type")]
pub principal_type: PrincipalType,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkAddPrincipalRequest {
pub principal: String,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub principal_type: Option<PrincipalType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkRemovePrincipalRequest {
pub principal: String,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub principal_type: Option<PrincipalType>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLink {
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub principals: Option<Vec<PrivateLinkPrincipal>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_configuration_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_configuration_arn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub share_arn: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub share_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connections: Option<Vec<PrivateLinkConnection>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub databases: Option<Vec<PrivateLinkDatabase>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub subscription_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub region_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub error_message: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkPrincipal {
#[serde(skip_serializing_if = "Option::is_none")]
pub principal: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub principal_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub alias: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub status: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkConnection {
#[serde(skip_serializing_if = "Option::is_none")]
pub association_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub connection_id: Option<String>,
#[serde(rename = "type", skip_serializing_if = "Option::is_none")]
pub connection_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub owner_id: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub association_date: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkDatabase {
#[serde(skip_serializing_if = "Option::is_none")]
pub database_id: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub port: Option<i32>,
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_link_endpoint: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct PrivateLinkEndpointScript {
#[serde(skip_serializing_if = "Option::is_none")]
pub resource_endpoint_script: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub terraform_aws_script: Option<String>,
}
pub struct PrivateLinkHandler {
client: CloudClient,
}
impl PrivateLinkHandler {
#[must_use]
pub fn new(client: CloudClient) -> Self {
Self { client }
}
pub async fn get(&self, subscription_id: i32) -> Result<Value> {
self.client
.get(&format!("/subscriptions/{subscription_id}/private-link"))
.await
}
pub async fn create(
&self,
subscription_id: i32,
request: &PrivateLinkCreateRequest,
) -> Result<Value> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/private-link"),
request,
)
.await
}
pub async fn add_principals(
&self,
subscription_id: i32,
request: &PrivateLinkAddPrincipalRequest,
) -> Result<Value> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/private-link/principals"),
request,
)
.await
}
pub async fn remove_principals(
&self,
subscription_id: i32,
request: &PrivateLinkRemovePrincipalRequest,
) -> Result<Value> {
self.client
.delete_with_body(
&format!("/subscriptions/{subscription_id}/private-link/principals"),
serde_json::to_value(request).unwrap_or_default(),
)
.await
}
pub async fn get_endpoint_script(&self, subscription_id: i32) -> Result<Value> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/private-link/endpoint-script"
))
.await
}
pub async fn delete(&self, subscription_id: i32) -> Result<Value> {
self.client
.delete_raw(&format!("/subscriptions/{subscription_id}/private-link"))
.await
}
pub async fn get_active_active(&self, subscription_id: i32, region_id: i32) -> Result<Value> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/private-link"
))
.await
}
pub async fn create_active_active(
&self,
subscription_id: i32,
region_id: i32,
request: &PrivateLinkCreateRequest,
) -> Result<Value> {
self.client
.post(
&format!("/subscriptions/{subscription_id}/regions/{region_id}/private-link"),
request,
)
.await
}
pub async fn add_principals_active_active(
&self,
subscription_id: i32,
region_id: i32,
request: &PrivateLinkAddPrincipalRequest,
) -> Result<Value> {
self.client
.post(
&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/private-link/principals"
),
request,
)
.await
}
pub async fn remove_principals_active_active(
&self,
subscription_id: i32,
region_id: i32,
request: &PrivateLinkRemovePrincipalRequest,
) -> Result<Value> {
self.client
.delete_with_body(
&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/private-link/principals"
),
serde_json::to_value(request).unwrap_or_default(),
)
.await
}
pub async fn get_endpoint_script_active_active(
&self,
subscription_id: i32,
region_id: i32,
) -> Result<Value> {
self.client
.get(&format!(
"/subscriptions/{subscription_id}/regions/{region_id}/private-link/endpoint-script"
))
.await
}
}