Skip to main content

alien_core/bindings/
artifact_registry.rs

1//! Service-type based artifact registry binding definitions
2
3use super::BindingValue;
4use serde::{Deserialize, Serialize};
5
6/// AWS ECR (Elastic Container Registry) binding configuration
7#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
8#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
9#[serde(rename_all = "camelCase")]
10pub struct EcrArtifactRegistryBinding {
11    /// Repository prefix for this registry (used to construct ECR repository names)
12    pub repository_prefix: BindingValue<String>,
13    /// ARN of the IAM role for pull permissions (optional)
14    pub pull_role_arn: BindingValue<Option<String>>,
15    /// ARN of the IAM role for push+pull permissions (optional)
16    pub push_role_arn: BindingValue<Option<String>>,
17}
18
19/// Azure Container Registry binding configuration
20#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
21#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
22#[serde(rename_all = "camelCase")]
23pub struct AcrArtifactRegistryBinding {
24    /// Registry name (e.g., "myregistry") - endpoint is derived from this
25    pub registry_name: BindingValue<String>,
26    /// Resource group name where the registry is located
27    pub resource_group_name: BindingValue<String>,
28}
29
30/// Google Artifact Registry binding configuration
31#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
32#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
33#[serde(rename_all = "camelCase")]
34pub struct GarArtifactRegistryBinding {
35    /// Optional service account email for pull permissions
36    pub pull_service_account_email: BindingValue<Option<String>>,
37    /// Optional service account email for push+pull permissions
38    pub push_service_account_email: BindingValue<Option<String>>,
39}
40
41/// Local container registry binding configuration
42#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
43#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
44#[serde(rename_all = "camelCase")]
45pub struct LocalArtifactRegistryBinding {
46    /// The registry URL endpoint (e.g., "http://localhost:5000")
47    pub registry_url: BindingValue<String>,
48    /// Optional base directory for registry data
49    pub data_dir: BindingValue<Option<String>>,
50}
51
52/// Service-type based artifact registry binding that supports multiple registry providers
53#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
54#[cfg_attr(feature = "openapi", derive(utoipa::ToSchema))]
55#[serde(tag = "service", rename_all = "lowercase")]
56pub enum ArtifactRegistryBinding {
57    /// AWS ECR (Elastic Container Registry)
58    Ecr(EcrArtifactRegistryBinding),
59    /// Azure Container Registry
60    Acr(AcrArtifactRegistryBinding),
61    /// Google Artifact Registry
62    Gar(GarArtifactRegistryBinding),
63    /// Local container registry
64    Local(LocalArtifactRegistryBinding),
65}
66
67impl ArtifactRegistryBinding {
68    /// Creates an ECR artifact registry binding
69    pub fn ecr(
70        repository_prefix: impl Into<BindingValue<String>>,
71        pull_role_arn: impl Into<BindingValue<Option<String>>>,
72        push_role_arn: impl Into<BindingValue<Option<String>>>,
73    ) -> Self {
74        Self::Ecr(EcrArtifactRegistryBinding {
75            repository_prefix: repository_prefix.into(),
76            pull_role_arn: pull_role_arn.into(),
77            push_role_arn: push_role_arn.into(),
78        })
79    }
80
81    /// Creates an ACR artifact registry binding
82    pub fn acr(
83        registry_name: impl Into<BindingValue<String>>,
84        resource_group_name: impl Into<BindingValue<String>>,
85    ) -> Self {
86        Self::Acr(AcrArtifactRegistryBinding {
87            registry_name: registry_name.into(),
88            resource_group_name: resource_group_name.into(),
89        })
90    }
91
92    /// Creates a GAR artifact registry binding
93    pub fn gar(
94        pull_service_account_email: impl Into<BindingValue<Option<String>>>,
95        push_service_account_email: impl Into<BindingValue<Option<String>>>,
96    ) -> Self {
97        Self::Gar(GarArtifactRegistryBinding {
98            pull_service_account_email: pull_service_account_email.into(),
99            push_service_account_email: push_service_account_email.into(),
100        })
101    }
102
103    /// Creates a local artifact registry binding
104    pub fn local(
105        registry_url: impl Into<BindingValue<String>>,
106        data_dir: impl Into<BindingValue<Option<String>>>,
107    ) -> Self {
108        Self::Local(LocalArtifactRegistryBinding {
109            registry_url: registry_url.into(),
110            data_dir: data_dir.into(),
111        })
112    }
113}