ic_query/cloud_engine/provider/model.rs
1//! Module: cloud_engine::provider::model
2//!
3//! Responsibility: CloudEngine provider requests, location rows, reports, and source data.
4//! Does not own: source validation, HTTP decoding, rendering, or command parsing.
5//! Boundary: preserves raw Dashboard provider and location fields without Registry promotion.
6
7use crate::ic::{IcDashboardReportProvenance, IcDashboardRequest};
8use serde::{Deserialize, Serialize};
9
10#[cfg(feature = "dashboard-host")]
11use crate::ic::IcSourceRequest;
12
13///
14/// CloudEngineProviderListRequest
15///
16/// Request for one complete official Dashboard provider resource filtered to CloudEngine rows.
17///
18
19#[derive(Clone, Debug, Eq, PartialEq)]
20pub struct CloudEngineProviderListRequest {
21 /// Requested network identity; the built-in source accepts only `ic`.
22 pub network: String,
23 /// Explicit Dashboard endpoint and caller collection clock.
24 pub dashboard: IcDashboardRequest,
25}
26
27impl CloudEngineProviderListRequest {
28 /// Construct one live CloudEngine provider-list request.
29 #[must_use]
30 pub fn new(network: impl Into<String>, dashboard: IcDashboardRequest) -> Self {
31 Self {
32 network: network.into(),
33 dashboard,
34 }
35 }
36}
37
38///
39/// CloudEngineProviderInfoRequest
40///
41/// Request for one exact official Dashboard node-provider record and its CloudEngine fields.
42///
43
44#[derive(Clone, Debug, Eq, PartialEq)]
45pub struct CloudEngineProviderInfoRequest {
46 /// Requested network identity; the built-in source accepts only `ic`.
47 pub network: String,
48 /// Explicit Dashboard endpoint and caller collection clock.
49 pub dashboard: IcDashboardRequest,
50 /// Exact node-provider principal.
51 pub node_provider_id: String,
52}
53
54impl CloudEngineProviderInfoRequest {
55 /// Construct one exact live provider request.
56 #[must_use]
57 pub fn new(
58 network: impl Into<String>,
59 dashboard: IcDashboardRequest,
60 node_provider_id: impl Into<String>,
61 ) -> Self {
62 Self {
63 network: network.into(),
64 dashboard,
65 node_provider_id: node_provider_id.into(),
66 }
67 }
68}
69
70///
71/// CloudEngineProviderLocation
72///
73/// Raw official Dashboard location attached to one node provider.
74///
75
76#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
77pub struct CloudEngineProviderLocation {
78 /// Dashboard data-center key.
79 pub dc_key: String,
80 /// Human-facing Dashboard location label.
81 pub display_name: String,
82 /// Raw decimal latitude decoded as a finite number.
83 pub latitude: f64,
84 /// Raw decimal longitude decoded as a finite number.
85 pub longitude: f64,
86 /// Dashboard data-center owner label.
87 pub owner: String,
88 /// Raw Dashboard region label.
89 pub region: String,
90}
91
92///
93/// CloudEngineProviderRow
94///
95/// One raw official Dashboard node-provider record with CloudEngine-specific evidence.
96///
97
98#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
99pub struct CloudEngineProviderRow {
100 /// Canonical node-provider principal.
101 pub principal_id: String,
102 /// Human-facing provider name.
103 pub display_name: String,
104 /// Raw optional website text.
105 pub website: Option<String>,
106 /// Raw optional Dashboard logo URL.
107 pub logo_url: Option<String>,
108 /// Number of all Dashboard locations represented by `locations`.
109 pub location_count: usize,
110 /// Dashboard locations associated with the provider's ordinary IC nodes.
111 pub locations: Vec<CloudEngineProviderLocation>,
112 /// Number of CloudEngine locations represented by `cloud_engine_locations`.
113 pub cloud_engine_location_count: usize,
114 /// Independent Dashboard locations carrying CloudEngine evidence.
115 pub cloud_engine_locations: Vec<CloudEngineProviderLocation>,
116 /// Raw Dashboard total for CloudEngine nodes.
117 pub total_cloud_engine_nodes: u64,
118 /// Raw Dashboard total for unassigned CloudEngine nodes.
119 pub total_cloud_engine_unassigned_nodes: u64,
120 /// Raw Dashboard total for CloudEngine instances.
121 pub total_cloud_engines: u64,
122 /// Raw Dashboard total node allowance.
123 pub total_node_allowance: u64,
124 /// Raw Dashboard total ordinary nodes.
125 pub total_nodes: u64,
126 /// Raw Dashboard total rewardable nodes.
127 pub total_rewardable_nodes: u64,
128 /// Raw Dashboard total Subnets.
129 pub total_subnets: u64,
130 /// Raw Dashboard total unassigned ordinary nodes.
131 pub total_unassigned_nodes: u64,
132}
133
134impl CloudEngineProviderRow {
135 /// Whether any returned CloudEngine-specific field carries nonempty evidence.
136 #[must_use]
137 pub const fn has_cloud_engine_evidence(&self) -> bool {
138 self.cloud_engine_location_count > 0
139 || !self.cloud_engine_locations.is_empty()
140 || self.total_cloud_engine_nodes > 0
141 || self.total_cloud_engine_unassigned_nodes > 0
142 || self.total_cloud_engines > 0
143 }
144}
145
146///
147/// CloudEngineProviderListReport
148///
149/// Complete Dashboard provider resource filtered to rows with explicit CloudEngine evidence.
150///
151
152#[derive(Clone, Debug, PartialEq, Serialize)]
153pub struct CloudEngineProviderListReport {
154 /// Shared official Dashboard provenance, flattened in report JSON.
155 #[serde(flatten)]
156 pub provenance: IcDashboardReportProvenance,
157 /// Number of provider rows in the complete source resource before filtering.
158 pub source_node_provider_count: usize,
159 /// CloudEngine-bearing providers in canonical principal order.
160 pub providers: Vec<CloudEngineProviderRow>,
161}
162
163///
164/// CloudEngineProviderInfoReport
165///
166/// One exact Dashboard provider record with an explicit CloudEngine-scope classification.
167///
168
169#[derive(Clone, Debug, PartialEq, Serialize)]
170pub struct CloudEngineProviderInfoReport {
171 /// Shared official Dashboard provenance, flattened in report JSON.
172 #[serde(flatten)]
173 pub provenance: IcDashboardReportProvenance,
174 /// Whether the exact row contains any explicit CloudEngine evidence.
175 pub cloud_engine_evidence_present: bool,
176 /// Exact raw provider record.
177 pub provider: CloudEngineProviderRow,
178}
179
180///
181/// CloudEngineProviderListSourceData
182///
183/// Complete decoded official Dashboard provider resource returned by a source.
184///
185
186#[cfg(feature = "dashboard-host")]
187#[derive(Clone, Debug, PartialEq)]
188pub struct CloudEngineProviderListSourceData {
189 /// Source request and collection provenance echoed by the source.
190 pub source: IcSourceRequest,
191 /// Every provider row returned by the complete resource before filtering.
192 pub providers: Vec<CloudEngineProviderRow>,
193}
194
195///
196/// CloudEngineProviderInfoSourceData
197///
198/// Exact decoded official Dashboard provider record returned by a source.
199///
200
201#[cfg(feature = "dashboard-host")]
202#[derive(Clone, Debug, PartialEq)]
203pub struct CloudEngineProviderInfoSourceData {
204 /// Source request and collection provenance echoed by the source.
205 pub source: IcSourceRequest,
206 /// Exact provider row returned by the source.
207 pub provider: CloudEngineProviderRow,
208}