Skip to content

Commit 23e489f

Browse files
[DOP-22140] Add API schemas for SFTP, FTP, FTPS, WebDAV, Samba file sources (#187)
1 parent d83ad79 commit 23e489f

39 files changed

+1364
-42
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
Add API schemas for SFTP, FTP, FTPS, WebDAV, Samba file sources

syncmaster/db/models/connection.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,11 @@ class ConnectionType(StrEnum):
2424
MYSQL = "mysql"
2525
S3 = "s3"
2626
HDFS = "hdfs"
27+
SFTP = "sftp"
28+
FTP = "ftp"
29+
FTPS = "ftps"
30+
WEBDAV = "webdav"
31+
SAMBA = "samba"
2732

2833

2934
class Connection(Base, ResourceMixin, TimestampMixin):
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2+
# SPDX-License-Identifier: Apache-2.0
3+
from syncmaster.schemas.v1.auth.basic import (
4+
BasicAuthSchema,
5+
CreateBasicAuthSchema,
6+
ReadBasicAuthSchema,
7+
UpdateBasicAuthSchema,
8+
)
9+
from syncmaster.schemas.v1.auth.s3 import (
10+
CreateS3AuthSchema,
11+
ReadS3AuthSchema,
12+
S3AuthSchema,
13+
UpdateS3AuthSchema,
14+
)
15+
from syncmaster.schemas.v1.auth.samba import (
16+
CreateSambaAuthSchema,
17+
ReadSambaAuthSchema,
18+
SambaAuthSchema,
19+
UpdateSambaAuthSchema,
20+
)
21+
from syncmaster.schemas.v1.auth.token import AuthTokenSchema, TokenPayloadSchema
Lines changed: 0 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,6 @@
55
from pydantic import BaseModel, SecretStr
66

77

8-
class TokenPayloadSchema(BaseModel):
9-
user_id: int
10-
11-
12-
class AuthTokenSchema(BaseModel):
13-
access_token: str
14-
token_type: str
15-
expires_at: float
16-
17-
188
class BasicAuthSchema(BaseModel):
199
type: Literal["basic"]
2010

@@ -31,21 +21,3 @@ class ReadBasicAuthSchema(BasicAuthSchema):
3121
class UpdateBasicAuthSchema(BasicAuthSchema):
3222
user: str | None = None # noqa: F722
3323
password: SecretStr | None = None
34-
35-
36-
class S3AuthSchema(BaseModel):
37-
type: Literal["s3"]
38-
39-
40-
class CreateS3AuthSchema(S3AuthSchema):
41-
access_key: str
42-
secret_key: SecretStr
43-
44-
45-
class ReadS3AuthSchema(S3AuthSchema):
46-
access_key: str
47-
48-
49-
class UpdateS3AuthSchema(S3AuthSchema):
50-
access_key: str | None = None
51-
secret_key: SecretStr | None = None

syncmaster/schemas/v1/auth/s3.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2+
# SPDX-License-Identifier: Apache-2.0
3+
from typing import Literal
4+
5+
from pydantic import BaseModel, SecretStr
6+
7+
8+
class S3AuthSchema(BaseModel):
9+
type: Literal["s3"]
10+
11+
12+
class CreateS3AuthSchema(S3AuthSchema):
13+
access_key: str
14+
secret_key: SecretStr
15+
16+
17+
class ReadS3AuthSchema(S3AuthSchema):
18+
access_key: str
19+
20+
21+
class UpdateS3AuthSchema(S3AuthSchema):
22+
access_key: str | None = None
23+
secret_key: SecretStr | None = None
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2+
# SPDX-License-Identifier: Apache-2.0
3+
from typing import Literal
4+
5+
from pydantic import BaseModel, SecretStr
6+
7+
8+
class SambaAuthSchema(BaseModel):
9+
type: Literal["samba"]
10+
11+
12+
class CreateSambaAuthSchema(SambaAuthSchema):
13+
user: str
14+
password: SecretStr
15+
auth_type: Literal["NTLMv1", "NTLMv2"] = "NTLMv2"
16+
17+
18+
class ReadSambaAuthSchema(SambaAuthSchema):
19+
user: str
20+
auth_type: Literal["NTLMv1", "NTLMv2"]
21+
22+
23+
class UpdateSambaAuthSchema(SambaAuthSchema):
24+
user: str | None = None
25+
password: SecretStr | None = None
26+
auth_type: Literal["NTLMv1", "NTLMv2"] | None = None
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2+
# SPDX-License-Identifier: Apache-2.0
3+
from pydantic import BaseModel
4+
5+
6+
class TokenPayloadSchema(BaseModel):
7+
user_id: int
8+
9+
10+
class AuthTokenSchema(BaseModel):
11+
access_token: str
12+
token_type: str
13+
expires_at: float

syncmaster/schemas/v1/connection_types.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,3 +10,8 @@
1010
MYSQL_TYPE = Literal["mysql"]
1111
S3_TYPE = Literal["s3"]
1212
HDFS_TYPE = Literal["hdfs"]
13+
SFTP_TYPE = Literal["sftp"]
14+
FTP_TYPE = Literal["ftp"]
15+
FTPS_TYPE = Literal["ftps"]
16+
WEBDAV_TYPE = Literal["webdav"]
17+
SAMBA_TYPE = Literal["samba"]

syncmaster/schemas/v1/connections/connection.py

Lines changed: 43 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,16 @@
1010
ReadClickhouseConnectionSchema,
1111
UpdateClickhouseConnectionSchema,
1212
)
13+
from syncmaster.schemas.v1.connections.ftp import (
14+
CreateFTPConnectionSchema,
15+
ReadFTPConnectionSchema,
16+
UpdateFTPConnectionSchema,
17+
)
18+
from syncmaster.schemas.v1.connections.ftps import (
19+
CreateFTPSConnectionSchema,
20+
ReadFTPSConnectionSchema,
21+
UpdateFTPSConnectionSchema,
22+
)
1323
from syncmaster.schemas.v1.connections.hdfs import (
1424
CreateHDFSConnectionSchema,
1525
ReadHDFSConnectionSchema,
@@ -45,6 +55,21 @@
4555
ReadS3ConnectionSchema,
4656
UpdateS3ConnectionSchema,
4757
)
58+
from syncmaster.schemas.v1.connections.samba import (
59+
CreateSambaConnectionSchema,
60+
ReadSambaConnectionSchema,
61+
UpdateSambaConnectionSchema,
62+
)
63+
from syncmaster.schemas.v1.connections.sftp import (
64+
CreateSFTPConnectionSchema,
65+
ReadSFTPConnectionSchema,
66+
UpdateSFTPConnectionSchema,
67+
)
68+
from syncmaster.schemas.v1.connections.webdav import (
69+
CreateWebDAVConnectionSchema,
70+
ReadWebDAVConnectionSchema,
71+
UpdateWebDAVConnectionSchema,
72+
)
4873
from syncmaster.schemas.v1.page import PageSchema
4974
from syncmaster.schemas.v1.types import NameConstr
5075

@@ -56,7 +81,12 @@
5681
| CreateClickhouseConnectionSchema
5782
| CreateHiveConnectionSchema
5883
| CreateHDFSConnectionSchema
59-
| CreateS3ConnectionSchema,
84+
| CreateS3ConnectionSchema
85+
| CreateSFTPConnectionSchema
86+
| CreateFTPConnectionSchema
87+
| CreateFTPSConnectionSchema
88+
| CreateWebDAVConnectionSchema
89+
| CreateSambaConnectionSchema,
6090
Field(discriminator="type"),
6191
]
6292
ReadConnectionSchema = Annotated[
@@ -67,7 +97,12 @@
6797
| ReadClickhouseConnectionSchema
6898
| ReadHiveConnectionSchema
6999
| ReadHDFSConnectionSchema
70-
| ReadS3ConnectionSchema,
100+
| ReadS3ConnectionSchema
101+
| ReadSFTPConnectionSchema
102+
| ReadFTPConnectionSchema
103+
| ReadFTPSConnectionSchema
104+
| ReadWebDAVConnectionSchema
105+
| ReadSambaConnectionSchema,
71106
Field(discriminator="type"),
72107
]
73108
UpdateConnectionSchema = Annotated[
@@ -78,7 +113,12 @@
78113
| UpdateClickhouseConnectionSchema
79114
| UpdateHiveConnectionSchema
80115
| UpdateHDFSConnectionSchema
81-
| UpdateS3ConnectionSchema,
116+
| UpdateS3ConnectionSchema
117+
| UpdateSFTPConnectionSchema
118+
| UpdateFTPConnectionSchema
119+
| UpdateFTPSConnectionSchema
120+
| UpdateWebDAVConnectionSchema
121+
| UpdateSambaConnectionSchema,
82122
Field(discriminator="type"),
83123
]
84124

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
# SPDX-FileCopyrightText: 2023-2024 MTS PJSC
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
from pydantic import BaseModel, Field
5+
6+
from syncmaster.schemas.v1.auth import (
7+
CreateBasicAuthSchema,
8+
ReadBasicAuthSchema,
9+
UpdateBasicAuthSchema,
10+
)
11+
from syncmaster.schemas.v1.connection_types import FTP_TYPE
12+
from syncmaster.schemas.v1.connections.connection_base import (
13+
CreateConnectionBaseSchema,
14+
ReadConnectionBaseSchema,
15+
UpdateConnectionBaseSchema,
16+
)
17+
18+
19+
class CreateFTPConnectionDataSchema(BaseModel):
20+
host: str
21+
port: int
22+
23+
24+
class ReadFTPConnectionDataSchema(BaseModel):
25+
host: str
26+
port: int
27+
28+
29+
class UpdateFTPConnectionDataSchema(BaseModel):
30+
host: str | None = None
31+
port: int | None = None
32+
33+
34+
class CreateFTPConnectionSchema(CreateConnectionBaseSchema):
35+
type: FTP_TYPE = Field(..., description="Connection type")
36+
data: CreateFTPConnectionDataSchema = Field(
37+
...,
38+
alias="connection_data",
39+
description=(
40+
"Data required to connect to the remote server. These are the parameters that are specified in the URL request."
41+
),
42+
)
43+
auth_data: CreateBasicAuthSchema = Field(
44+
description="Credentials for authorization",
45+
)
46+
47+
48+
class ReadFTPConnectionSchema(ReadConnectionBaseSchema):
49+
type: FTP_TYPE
50+
data: ReadFTPConnectionDataSchema = Field(alias="connection_data")
51+
auth_data: ReadBasicAuthSchema | None = None
52+
53+
54+
class UpdateFTPConnectionSchema(UpdateConnectionBaseSchema):
55+
type: FTP_TYPE
56+
data: UpdateFTPConnectionDataSchema | None = Field(alias="connection_data", default=None)
57+
auth_data: UpdateBasicAuthSchema | None = None

0 commit comments

Comments
 (0)