greentic_types/
deployment.rs

1//! Generic deployment planning structures shared between packs, runners, and deployers.
2
3use alloc::string::String;
4use alloc::vec::Vec;
5
6use semver::Version;
7
8#[cfg(feature = "schemars")]
9use schemars::JsonSchema;
10#[cfg(feature = "serde")]
11use serde::{Deserialize, Serialize};
12use serde_json::Value;
13
14/// Provider-agnostic deployment description shared across tools.
15#[derive(Clone, Debug, PartialEq)]
16#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
17#[cfg_attr(feature = "schemars", derive(JsonSchema))]
18pub struct DeploymentPlan {
19    /// Pack being deployed.
20    pub pack_id: String,
21    /// Pack version.
22    #[cfg_attr(
23        feature = "schemars",
24        schemars(with = "String", description = "SemVer version")
25    )]
26    pub pack_version: Version,
27    /// Tenant identifier.
28    pub tenant: String,
29    /// Environment identifier.
30    pub environment: String,
31    /// Logical runtime topology.
32    pub runners: Vec<RunnerPlan>,
33    /// Messaging fabric description.
34    #[cfg_attr(
35        feature = "serde",
36        serde(default, skip_serializing_if = "Option::is_none")
37    )]
38    pub messaging: Option<MessagingPlan>,
39    /// Channel entrypoints into the pack.
40    pub channels: Vec<ChannelPlan>,
41    /// Secrets required to operate the pack.
42    pub secrets: Vec<SecretPlan>,
43    /// OAuth client requirements.
44    pub oauth: Vec<OAuthPlan>,
45    /// Telemetry guidance.
46    #[cfg_attr(
47        feature = "serde",
48        serde(default, skip_serializing_if = "Option::is_none")
49    )]
50    pub telemetry: Option<TelemetryPlan>,
51    /// Free-form extension space.
52    #[cfg_attr(feature = "serde", serde(default))]
53    pub extra: Value,
54}
55
56/// Runner sizing and capabilities plan.
57#[derive(Clone, Debug, PartialEq)]
58#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
59#[cfg_attr(feature = "schemars", derive(JsonSchema))]
60pub struct RunnerPlan {
61    /// Logical runner name.
62    pub name: String,
63    /// Desired concurrency level.
64    pub replicas: u32,
65    /// Additional hints/capabilities (opaque).
66    #[cfg_attr(feature = "serde", serde(default))]
67    pub capabilities: Value,
68}
69
70/// Messaging cluster plan.
71#[derive(Clone, Debug, PartialEq)]
72#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
73#[cfg_attr(feature = "schemars", derive(JsonSchema))]
74pub struct MessagingPlan {
75    /// Logical cluster identifier.
76    pub logical_cluster: String,
77    /// Subjects/streams required by the pack.
78    pub subjects: Vec<MessagingSubjectPlan>,
79    /// Extension metadata.
80    #[cfg_attr(feature = "serde", serde(default))]
81    pub extra: Value,
82}
83
84/// Messaging subject plan entry.
85#[derive(Clone, Debug, PartialEq)]
86#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
87#[cfg_attr(feature = "schemars", derive(JsonSchema))]
88pub struct MessagingSubjectPlan {
89    /// Subject/stream name.
90    pub name: String,
91    /// Intended use.
92    pub purpose: String,
93    /// Whether durability is required.
94    pub durable: bool,
95    /// Extension metadata.
96    #[cfg_attr(feature = "serde", serde(default))]
97    pub extra: Value,
98}
99
100/// Channel entrypoint description.
101#[derive(Clone, Debug, PartialEq)]
102#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
103#[cfg_attr(feature = "schemars", derive(JsonSchema))]
104pub struct ChannelPlan {
105    /// Logical channel name.
106    pub name: String,
107    /// Flow entrypoint.
108    pub flow_id: String,
109    /// Connector kind (opaque).
110    pub kind: String,
111    /// Connector-specific configuration.
112    #[cfg_attr(feature = "serde", serde(default))]
113    pub config: Value,
114}
115
116/// Secret requirement entry.
117#[derive(Clone, Debug, PartialEq, Eq)]
118#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
119#[cfg_attr(feature = "schemars", derive(JsonSchema))]
120pub struct SecretPlan {
121    /// Logical secret key.
122    pub key: String,
123    /// Whether the secret must exist.
124    pub required: bool,
125    /// Scope identifier (tenant/environment/etc.).
126    pub scope: String,
127}
128
129/// OAuth client requirement entry.
130#[derive(Clone, Debug, PartialEq)]
131#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
132#[cfg_attr(feature = "schemars", derive(JsonSchema))]
133pub struct OAuthPlan {
134    /// Provider identifier.
135    pub provider_id: String,
136    /// Logical client identifier.
137    pub logical_client_id: String,
138    /// Redirect path relative to host choice.
139    pub redirect_path: String,
140    /// Extension metadata.
141    #[cfg_attr(feature = "serde", serde(default))]
142    pub extra: Value,
143}
144
145/// Telemetry configuration hints.
146#[derive(Clone, Debug, PartialEq)]
147#[cfg_attr(feature = "serde", derive(Serialize, Deserialize))]
148#[cfg_attr(feature = "schemars", derive(JsonSchema))]
149pub struct TelemetryPlan {
150    /// Whether telemetry must be configured.
151    pub required: bool,
152    /// Optional suggested endpoint.
153    #[cfg_attr(
154        feature = "serde",
155        serde(default, skip_serializing_if = "Option::is_none")
156    )]
157    pub suggested_endpoint: Option<String>,
158    /// Extension metadata.
159    #[cfg_attr(feature = "serde", serde(default))]
160    pub extra: Value,
161}