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