1use std::str::FromStr;
16
17use crate::error::{
18 SdkApiError,
19 SdkError,
20};
21use crate::{
22 auth::AuthContext,
23 error::Result,
24 metadata::CallProperties,
25 util::make_request_with_metadata,
26};
27
28pub use cx_api::proto::com::coralogixapis::slo::v1::{
29 IsFilterPredicate,
30 Metric,
31 RequestBasedMetricSli,
32 Slo,
33 SloConstantFilterField,
34 SloFilter,
35 SloFilterField,
36 SloFilterPredicate,
37 SloFilters,
38 SloTimeFrame,
39 WindowBasedMetricSli,
40 slo::{
41 Sli,
42 Window,
43 },
44 slo_filter_field::Field,
45 slo_filter_predicate::Predicate,
46};
47
48use cx_api::proto::com::coralogixapis::slo::v1::slos_service_client::SlosServiceClient;
49use cx_api::proto::com::coralogixapis::slo::v1::{
50 BatchGetSlosRequest,
51 BatchGetSlosResponse,
52 CreateSloRequest,
53 CreateSloResponse,
54 DeleteSloRequest,
55 DeleteSloResponse,
56 GetSloRequest,
57 GetSloResponse,
58 ListSlosRequest,
59 ListSlosResponse,
60 ReplaceSloRequest,
61 ReplaceSloResponse,
62};
63use tokio::sync::Mutex;
64use tonic::{
65 metadata::MetadataMap,
66 transport::{
67 Channel,
68 ClientTlsConfig,
69 Endpoint,
70 },
71};
72
73use crate::CoralogixRegion;
74
75const INFRA_MONITORING_FEATURE_GROUP_ID: &str = "infra-monitoring";
76
77pub struct SloClient {
80 metadata_map: MetadataMap,
81 service_client: Mutex<SlosServiceClient<Channel>>,
82}
83
84impl SloClient {
85 pub fn new(auth_context: AuthContext, region: CoralogixRegion) -> Result<Self> {
91 let channel: Channel = Endpoint::from_str(region.grpc_endpoint().as_str())?
92 .tls_config(ClientTlsConfig::new().with_native_roots())?
93 .connect_lazy();
94 let request_metadata: CallProperties = (&auth_context.team_level_api_key).into();
95 Ok(Self {
96 metadata_map: request_metadata.to_metadata_map(),
97 service_client: Mutex::new(SlosServiceClient::new(channel)),
98 })
99 }
100
101 pub async fn create(&self, slo: Slo) -> Result<CreateSloResponse> {
106 let request = make_request_with_metadata(
107 CreateSloRequest {
108 slo: Some(slo),
109 silence_data_validations: Some(true),
110 },
111 &self.metadata_map,
112 );
113 self.service_client
114 .lock()
115 .await
116 .create_slo(request)
117 .await
118 .map(|r| r.into_inner())
119 .map_err(|status| {
120 SdkError::ApiError(SdkApiError {
121 status,
122 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/CreateServiceSlo"
123 .to_string(),
124 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
125 })
126 })
127 }
128
129 pub async fn update(&self, slo: Slo) -> Result<ReplaceSloResponse> {
134 let request = make_request_with_metadata(
135 ReplaceSloRequest {
136 slo: Some(slo),
137 silence_data_validations: Some(true),
138 },
139 &self.metadata_map,
140 );
141 self.service_client
142 .lock()
143 .await
144 .replace_slo(request)
145 .await
146 .map(|r| r.into_inner())
147 .map_err(|status| {
148 SdkError::ApiError(SdkApiError {
149 status,
150 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ReplaceServiceSlo"
151 .to_string(),
152 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
153 })
154 })
155 }
156
157 pub async fn delete(&self, id: String) -> Result<DeleteSloResponse> {
162 let request = make_request_with_metadata(DeleteSloRequest { id }, &self.metadata_map);
163 self.service_client
164 .lock()
165 .await
166 .delete_slo(request)
167 .await
168 .map(|r| r.into_inner())
169 .map_err(|status| {
170 SdkError::ApiError(SdkApiError {
171 status,
172 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/DeleteServiceSlo"
173 .to_string(),
174 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
175 })
176 })
177 }
178
179 pub async fn get(&self, id: String) -> Result<GetSloResponse> {
184 let request = make_request_with_metadata(GetSloRequest { id }, &self.metadata_map);
185
186 self.service_client
187 .lock()
188 .await
189 .get_slo(request)
190 .await
191 .map(|r| r.into_inner())
192 .map_err(|status| {
193 SdkError::ApiError(SdkApiError {
194 status,
195 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/GetServiceSlo"
196 .to_string(),
197 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
198 })
199 })
200 }
201
202 pub async fn get_bulk(&self, ids: Vec<String>) -> Result<BatchGetSlosResponse> {
207 let request = make_request_with_metadata(BatchGetSlosRequest { ids }, &self.metadata_map);
208
209 self.service_client
210 .lock()
211 .await
212 .batch_get_slos(request)
213 .await
214 .map(|r| r.into_inner())
215 .map_err(|status| {
216 SdkError::ApiError(SdkApiError {
217 status,
218 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/BatchGetServiceSlos"
219 .to_string(),
220 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
221 })
222 })
223 }
224
225 pub async fn list(&self, filters: Option<SloFilters>) -> Result<ListSlosResponse> {
230 let request = make_request_with_metadata(ListSlosRequest { filters }, &self.metadata_map);
231
232 self.service_client
233 .lock()
234 .await
235 .list_slos(request)
236 .await
237 .map(|r| r.into_inner())
238 .map_err(|status| {
239 SdkError::ApiError(SdkApiError {
240 status,
241 endpoint: "/com.coralogixapis.slo.v1.ServiceSloService/ListServiceSlos"
242 .to_string(),
243 feature_group: INFRA_MONITORING_FEATURE_GROUP_ID.to_string(),
244 })
245 })
246 }
247}