Skip to content

Commit 9e4ae4f

Browse files
authored
[REST] enforce backward compatibility before shipping (#2057)
1 parent 662cfab commit 9e4ae4f

File tree

2 files changed

+112
-2
lines changed

2 files changed

+112
-2
lines changed

src/moonlink_service/src/rest_api.rs

Lines changed: 91 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,11 @@ impl ApiState {
5555
/// ====================
5656
///
5757
/// Request mode.
58-
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
58+
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Default)]
5959
#[serde(rename_all = "lowercase")]
6060
pub enum RequestMode {
6161
/// Only issues request, but not block wait its completion.
62+
#[default]
6263
Async,
6364
/// Block wait request completion.
6465
Sync,
@@ -67,6 +68,7 @@ pub enum RequestMode {
6768
/// Error response structure
6869
#[derive(Debug, Serialize)]
6970
pub struct ErrorResponse {
71+
#[serde(rename = "message")]
7072
pub message: String,
7173
}
7274

@@ -87,18 +89,32 @@ pub struct GetTableSchemaResponse {
8789
/// Request structure for table creation
8890
#[derive(Debug, Serialize, Deserialize)]
8991
pub struct CreateTableRequest {
92+
#[serde(rename = "database")]
9093
pub database: String,
94+
95+
#[serde(rename = "table")]
9196
pub table: String,
97+
98+
#[serde(rename = "schema")]
9299
pub schema: Option<Vec<FieldSchema>>,
100+
101+
#[serde(rename = "avro_schema")]
93102
pub avro_schema: Option<serde_json::Value>,
103+
104+
#[serde(rename = "table_config")]
94105
pub table_config: TableConfig,
95106
}
96107

97108
/// Response structure for table creation
98109
#[derive(Debug, Serialize, Deserialize)]
99110
pub struct CreateTableResponse {
111+
#[serde(rename = "database")]
100112
pub database: String,
113+
114+
#[serde(rename = "table")]
101115
pub table: String,
116+
117+
#[serde(rename = "lsn")]
102118
pub lsn: u64,
103119
}
104120

@@ -109,18 +125,29 @@ pub struct CreateTableResponse {
109125
/// Request structure for kafka schema creation.
110126
#[derive(Debug, Serialize, Deserialize)]
111127
pub struct SetAvroSchemaRequest {
128+
#[serde(rename = "database")]
112129
pub database: String,
130+
131+
#[serde(rename = "table")]
113132
pub table: String,
114133
/// Avro schema JSON object
134+
#[serde(rename = "kafka_schema")]
115135
pub kafka_schema: serde_json::Value,
136+
137+
#[serde(rename = "schema_id")]
116138
pub schema_id: u64,
117139
}
118140

119141
/// Response structure for kafka schema creation.
120142
#[derive(Debug, Serialize, Deserialize)]
121143
pub struct SetAvroSchemaResponse {
144+
#[serde(rename = "database")]
122145
pub database: String,
146+
147+
#[serde(rename = "table")]
123148
pub table: String,
149+
150+
#[serde(rename = "schema_id")]
124151
pub schema_id: u64,
125152
}
126153

@@ -131,18 +158,32 @@ pub struct SetAvroSchemaResponse {
131158
/// Request structure for creating table from PostgreSQL source
132159
#[derive(Debug, Serialize, Deserialize)]
133160
pub struct CreateTableFromPostgresRequest {
161+
#[serde(rename = "database")]
134162
pub database: String,
163+
164+
#[serde(rename = "table")]
135165
pub table: String,
166+
167+
#[serde(rename = "src_uri")]
136168
pub src_uri: String,
169+
170+
#[serde(rename = "src_table_name")]
137171
pub src_table_name: String,
172+
173+
#[serde(rename = "table_config")]
138174
pub table_config: TableConfig,
139175
}
140176

141177
/// Response structure for creating table from PostgreSQL source
142178
#[derive(Debug, Serialize, Deserialize)]
143179
pub struct CreateTableFromPostgresResponse {
180+
#[serde(rename = "database")]
144181
pub database: String,
182+
183+
#[serde(rename = "table")]
145184
pub table: String,
185+
186+
#[serde(rename = "lsn")]
146187
pub lsn: u64,
147188
}
148189

@@ -153,7 +194,12 @@ pub struct CreateTableFromPostgresResponse {
153194
/// Request structure for table drop.
154195
#[derive(Debug, Serialize, Deserialize)]
155196
pub struct DropTableRequest {
197+
#[serde(rename = "database")]
198+
#[serde(default)]
156199
pub database: String,
200+
201+
#[serde(rename = "table")]
202+
#[serde(default)]
157203
pub table: String,
158204
}
159205

@@ -168,6 +214,7 @@ pub struct DropTableResponse {}
168214
/// Response structure for table list.
169215
#[derive(Debug, Serialize, Deserialize)]
170216
pub struct ListTablesResponse {
217+
#[serde(rename = "tables")]
171218
pub tables: Vec<TableStatus>,
172219
}
173220

@@ -178,8 +225,13 @@ pub struct ListTablesResponse {
178225
/// Request structure for table optimization.
179226
#[derive(Debug, Serialize, Deserialize)]
180227
pub struct OptimizeTableRequest {
228+
#[serde(rename = "database")]
181229
pub database: String,
230+
231+
#[serde(rename = "table")]
182232
pub table: String,
233+
234+
#[serde(rename = "mode")]
183235
pub mode: String,
184236
}
185237

@@ -194,8 +246,13 @@ pub struct OptimizeTableResponse {}
194246
/// Request structure for snapshot creation.
195247
#[derive(Debug, Serialize, Deserialize)]
196248
pub struct CreateSnapShotRequest {
249+
#[serde(rename = "database")]
197250
pub database: String,
251+
252+
#[serde(rename = "table")]
198253
pub table: String,
254+
255+
#[serde(rename = "lsn")]
199256
pub lsn: u64,
200257
}
201258

@@ -210,27 +267,42 @@ pub struct CreateSnapShotResponse {}
210267
/// Request structure for data ingestion
211268
#[derive(Debug, Serialize, Deserialize)]
212269
pub struct IngestRequest {
270+
#[serde(rename = "operation")]
213271
pub operation: String,
272+
273+
#[serde(rename = "data")]
214274
pub data: serde_json::Value,
215275
/// Whether to enable synchronous mode.
276+
#[serde(rename = "request_mode")]
277+
#[serde(default)]
216278
pub request_mode: RequestMode,
217279
}
218280

219281
/// Request structure for data ingestion with protobuf
220282
#[derive(Debug, Serialize, Deserialize)]
221283
pub struct IngestProtobufRequest {
284+
#[serde(rename = "operation")]
222285
pub operation: String,
286+
287+
#[serde(rename = "data")]
223288
pub data: Vec<u8>,
224289
/// Whether to enable synchronous mode.
290+
#[serde(rename = "request_mode")]
291+
#[serde(default)]
225292
pub request_mode: RequestMode,
226293
}
227294

228295
/// Response structure for data ingestion
229296
#[derive(Debug, Serialize, Deserialize)]
230297
pub struct IngestResponse {
298+
#[serde(rename = "table")]
231299
pub table: String,
300+
301+
#[serde(rename = "operation")]
232302
pub operation: String,
303+
233304
/// Assigned for synchronous mode.
305+
#[serde(rename = "lsn")]
234306
pub lsn: Option<u64>,
235307
}
236308

@@ -241,18 +313,26 @@ pub struct IngestResponse {
241313
#[derive(Debug, Serialize, Deserialize)]
242314
pub struct FileUploadRequest {
243315
/// Ingestion operation.
316+
#[serde(rename = "operation")]
244317
pub operation: String,
318+
245319
/// Files to ingest into mooncake table.
320+
#[serde(rename = "files")]
246321
pub files: Vec<String>,
322+
247323
/// Storage configuration to access files.
324+
#[serde(rename = "storage_config")]
248325
pub storage_config: StorageConfig,
249326
/// Whether to enable synchronous mode.
327+
#[serde(rename = "request_mode")]
328+
#[serde(default)]
250329
pub request_mode: RequestMode,
251330
}
252331

253332
#[derive(Debug, Serialize, Deserialize)]
254333
pub struct FileUploadResponse {
255334
/// Assigned for synchronous mode.
335+
#[serde(rename = "lsn")]
256336
pub lsn: Option<u64>,
257337
}
258338

@@ -262,8 +342,13 @@ pub struct FileUploadResponse {
262342
///
263343
#[derive(Debug, Serialize, Deserialize)]
264344
pub struct SyncFlushRequest {
345+
#[serde(rename = "database")]
265346
pub database: String,
347+
348+
#[serde(rename = "table")]
266349
pub table: String,
350+
351+
#[serde(rename = "lsn")]
267352
pub lsn: u64,
268353
}
269354

@@ -277,8 +362,13 @@ pub struct SyncFlushResponse {}
277362
/// Health check response
278363
#[derive(Debug, Serialize, Deserialize)]
279364
pub struct HealthResponse {
365+
#[serde(rename = "service")]
280366
pub service: String,
367+
368+
#[serde(rename = "status")]
281369
pub status: String,
370+
371+
#[serde(rename = "timestamp")]
282372
pub timestamp: u64,
283373
}
284374

src/moonlink_service/src/test.rs

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@ use serde_json::json;
44
use serial_test::serial;
55
use tokio::net::TcpStream;
66

7-
use crate::rest_api::{CreateTableResponse, FileUploadResponse, HealthResponse, IngestResponse};
7+
use crate::rest_api::{
8+
CreateTableResponse, DropTableRequest, FileUploadResponse, HealthResponse, IngestResponse,
9+
};
810
use crate::start_with_config;
911
use crate::test_guard::TestGuard;
1012
use crate::test_utils::*;
@@ -497,6 +499,24 @@ async fn test_drop_and_recreate_table() {
497499
assert_eq!(list_results.len(), 1);
498500
}
499501

502+
#[tokio::test]
503+
async fn test_drop_uses_defaults() {
504+
let s = r#"{}"#;
505+
let req: DropTableRequest = serde_json::from_str(s).unwrap();
506+
assert_eq!(req.database, "");
507+
assert_eq!(req.table, "");
508+
}
509+
510+
#[tokio::test]
511+
async fn test_drop_serialize_uses_renamed_fields() {
512+
let req = DropTableRequest {
513+
database: "database".into(),
514+
table: "users".into(),
515+
};
516+
let out = serde_json::to_string(&req).unwrap();
517+
assert!(out.contains("\"table\":\"users\""));
518+
}
519+
500520
/// Testing scenario: create multiple tables, and check list table result.
501521
#[tokio::test]
502522
#[serial]

0 commit comments

Comments
 (0)