[#3] Added generate proto script create container method

Signed-off-by: Ilyas Niyazov <i.niyazov@yadro.com>
This commit is contained in:
Ilyas Niyazov 2025-03-25 11:10:30 +03:00
parent fba6eaaa9c
commit d2e0c80f7c
16 changed files with 348 additions and 51 deletions

View file

@ -0,0 +1,47 @@
from dataclasses import dataclass
from typing import Optional
from frostfs_sdk.models.dto.version import Version, DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION
class MetaHeader:
def __init__(self, version=None, epoch: int = 0, ttl: int = 2):
"""
Initializes a MetaHeader object.
:param version: A Version object representing the version.
:param epoch: An integer representing the epoch (default: 0).
:param ttl: An integer representing the time-to-live (default: 2).
"""
self._version = None
self._epoch = None
self._ttl = None
# Set default values if not provided
self.set_version(version or Version(DEFAULT_MAJOR_VERSION, DEFAULT_MINOR_VERSION))
self.set_epoch(epoch)
self.set_ttl(ttl)
def get_version(self):
return self._version
def get_epoch(self):
return self._epoch
def get_ttl(self):
return self._ttl
def set_version(self, version):
if version is None:
raise ValueError(f"Input parameter is missing: {Version.__name__}")
self._version = version
def set_epoch(self, epoch: int):
if epoch < 0:
raise ValueError("Epoch must be greater than or equal to zero")
self._epoch = epoch
def set_ttl(self, ttl: int):
if ttl <= 0:
raise ValueError("TTL must be greater than zero")
self._ttl = ttl

View file

@ -1,6 +1,7 @@
from base58 import b58decode
from dataclasses import dataclass
@dataclass(frozen=True)
class OwnerId:
value: str

View file

@ -2,6 +2,8 @@ from typing import Optional
import grpc
from frostfs_sdk.client.models.client_environment import ClientEnvironment
from frostfs_sdk.client.services.context_accessor import ContextAccessor
from frostfs_sdk.models.mappers.placement_policy_mapper import PlacementPolicyMapper
from frostfs_sdk.models.mappers.owner_id_mapper import OwnerIdMapper
from frostfs_sdk.models.mappers.version_mapper import VersionMapper
@ -12,7 +14,7 @@ from frostfs_sdk.protos.models.container import types_pb2 as types_pb2_container
class ContainerMapper:
@staticmethod
def to_grpc_message(container: Container) -> Optional[types_pb2_container.Container]:
def to_grpc_message(container: Container, client_context: ClientEnvironment) -> Optional[types_pb2_container.Container]:
"""
Converts Container DTO to gRPC message
@ -30,18 +32,24 @@ class ContainerMapper:
for k, v in container.attributes.items()
]
if container.owner_id:
owner_id = OwnerIdMapper.to_grpc_message(container.owner_id)
else:
owner_id = OwnerIdMapper.to_grpc_message(client_context.owner_id)
if container.version:
version = VersionMapper.to_grpc_message(container.version)
else:
version = VersionMapper.to_grpc_message(client_context.version)
grpc_container = types_pb2_container.Container(
nonce=container.nonce.bytes,
placement_policy=PlacementPolicyMapper.to_grpc_message(container.placementPolicy),
owner_id=owner_id,
version=version,
attributes=attributes
)
if container.owner_id:
grpc_container.owner_id = OwnerIdMapper.to_grpc_message(container.owner_id)
if container.version:
grpc_container.version = VersionMapper.to_grpc_message(container.version)
return grpc_container
@staticmethod

View file

@ -0,0 +1,26 @@
from frostfs_sdk.models.mappers.version_mapper import VersionMapper
from frostfs_sdk.models.dto.meta_header import MetaHeader
from frostfs_sdk.protos.models.session import types_pb2 as types_pb2_session
class MetaHeaderMapper:
"""
Maps a MetaHeader object to a Protobuf RequestMetaHeader object.
"""
@staticmethod
def to_grpc_message(meta_header: MetaHeader):
"""
Converts a MetaHeader object to a Protobuf RequestMetaHeader object.
:param meta_header: A MetaHeader object.
:return: A Protobuf RequestMetaHeader object.
:raises ValueError: If the input meta_header is None.
"""
if meta_header is None:
raise ValueError(f"Input parameter is missing: {MetaHeader.__name__}")
return types_pb2_session.RequestMetaHeader(
version=VersionMapper.to_grpc_message(meta_header.get_version()),
epoch=meta_header.get_epoch(),
ttl=meta_header.get_ttl()
)

View file

@ -0,0 +1,44 @@
from google.protobuf.message import DecodeError
from frostfs_sdk.protos.models.session import types_pb2 as types_pb2_session
class SessionMapper:
@staticmethod
def serialize(token: types_pb2_session.SessionToken) -> bytes:
"""
Serializes a SessionToken object into a byte array.
:param token: A SessionToken Protobuf object.
:return: A byte array representing the serialized SessionToken.
:raises ValueError: If the input token is None.
:raises Exception: If serialization fails.
"""
if token is None:
raise ValueError(f"Input parameter is missing: {types_pb2_session.SessionToken.__name__}")
try:
# Serialize the token to bytes
return token.SerializeToString()
except Exception as e:
raise Exception(f"Serialization failed: {str(e)}")
@staticmethod
def deserialize_session_token(bytes_data: bytes) -> types_pb2_session.SessionToken:
"""
Deserializes a byte array into a SessionToken object.
:param bytes_data: A byte array representing the serialized SessionToken.
:return: A SessionToken Protobuf object.
:raises ValueError: If the input byte array is None or empty.
:raises Exception: If deserialization fails.
"""
if not bytes_data:
raise ValueError(f"Input parameter is missing: {types_pb2_session.SessionToken.__name__}")
try:
# Deserialize the byte array into a SessionToken object
session_token = types_pb2_session.SessionToken()
session_token.ParseFromString(bytes_data)
return session_token
except DecodeError as e:
raise Exception(f"Deserialization failed: {str(e)}")