[#3] Added generate proto script create container method
Signed-off-by: Ilyas Niyazov <i.niyazov@yadro.com>
This commit is contained in:
parent
19282f13cc
commit
297e107b10
52 changed files with 1380 additions and 74 deletions
30
frostfs_sdk/client/utils/message_helper.py
Normal file
30
frostfs_sdk/client/utils/message_helper.py
Normal file
|
@ -0,0 +1,30 @@
|
|||
from typing import Any
|
||||
from google.protobuf.message import Message
|
||||
|
||||
class MessageHelper:
|
||||
@staticmethod
|
||||
def get_field(message: Message, field_name: str):
|
||||
"""
|
||||
Retrieves the value of a field from a Protobuf message.
|
||||
|
||||
:param message: A Protobuf Message object.
|
||||
:param field_name: The name of the field to retrieve.
|
||||
:return: The value of the specified field.
|
||||
:raises ValueError: If the input parameters are invalid.
|
||||
"""
|
||||
if not message or not field_name or not isinstance(field_name, str) or not field_name.strip():
|
||||
raise ValueError("Some parameter is missing")
|
||||
|
||||
descriptor = message.DESCRIPTOR
|
||||
field_descriptor = descriptor.fields[field_name]
|
||||
if not field_descriptor:
|
||||
raise ValueError(f"Field '{field_name}' not found in message descriptor")
|
||||
|
||||
return getattr(field_descriptor, field_name)
|
||||
|
||||
@staticmethod
|
||||
def set_field(message: Message, field_name: str, value: Any) -> None:
|
||||
if message is None or not field_name.strip() or value is None:
|
||||
raise ValueError("Some parameter is missing")
|
||||
|
||||
setattr(message, message.DESCRIPTOR.fields[field_name], value)
|
47
frostfs_sdk/client/utils/request_constructor.py
Normal file
47
frostfs_sdk/client/utils/request_constructor.py
Normal file
|
@ -0,0 +1,47 @@
|
|||
from google.protobuf.message import Message
|
||||
from typing import Dict, Optional
|
||||
|
||||
from frostfs_sdk.models.mappers.meta_header_mapper import MetaHeaderMapper
|
||||
from frostfs_sdk.models.mappers.session_mapper import SessionMapper
|
||||
from frostfs_sdk.models.dto.meta_header import MetaHeader
|
||||
from frostfs_sdk.protos.models.session import types_pb2 as types_pb2_session
|
||||
|
||||
|
||||
META_HEADER_FIELD_NAME = "meta_header"
|
||||
|
||||
|
||||
class RequestConstructor:
|
||||
@staticmethod
|
||||
def add_meta_header(request: Message, x_headers: Optional[Dict[str, str]] = None, session_token: types_pb2_session.SessionToken = None):
|
||||
"""
|
||||
Adds a meta header to the request.
|
||||
|
||||
:param request: A Protobuf Message.Builder object.
|
||||
:param x_headers: Optional dictionary of custom headers.
|
||||
:param session_token: Optional session token.
|
||||
:raises ValueError: If the request or required fields are missing.
|
||||
"""
|
||||
if request is None:
|
||||
return
|
||||
|
||||
descriptor = request.DESCRIPTOR
|
||||
if getattr(descriptor, META_HEADER_FIELD_NAME) is None:
|
||||
raise ValueError(f"Required Protobuf field is missing: {META_HEADER_FIELD_NAME}")
|
||||
|
||||
meta_header = getattr(request, META_HEADER_FIELD_NAME)
|
||||
if meta_header.ByteSize() > 0:
|
||||
return
|
||||
|
||||
meta_header_builder = MetaHeaderMapper.to_grpc_message(MetaHeader())
|
||||
|
||||
if session_token and session_token.ByteSize() > 0:
|
||||
meta_header_builder.session_token = session_token
|
||||
|
||||
if x_headers:
|
||||
grpc_x_headers = [
|
||||
types_pb2_session.XHeader(key=key, value=value)
|
||||
for key, value in x_headers.items()
|
||||
]
|
||||
meta_header_builder.x_headers.extend(grpc_x_headers)
|
||||
|
||||
setattr(request, META_HEADER_FIELD_NAME, meta_header_builder.build())
|
39
frostfs_sdk/client/utils/session_cache.py
Normal file
39
frostfs_sdk/client/utils/session_cache.py
Normal file
|
@ -0,0 +1,39 @@
|
|||
|
||||
from dataclasses import dataclass
|
||||
from typing import Optional
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class SessionToken:
|
||||
token: bytes
|
||||
|
||||
|
||||
class SessionCache:
|
||||
def __init__(self, session_expiration_duration):
|
||||
self.cache = {}
|
||||
self.token_duration = session_expiration_duration
|
||||
self.current_epoch = 0
|
||||
|
||||
|
||||
def contains(self, key: str):
|
||||
return key in self.cache
|
||||
|
||||
def try_get_value(self, key: str) -> Optional[SessionToken]:
|
||||
if not key:
|
||||
return None
|
||||
return self.cache.get(key)
|
||||
|
||||
|
||||
def set_value(self, key: str, value: SessionToken):
|
||||
if key is not None:
|
||||
self.cache[key] = value
|
||||
|
||||
def delete_by_prefix(self, prefix: str):
|
||||
# Collect keys to avoid modifying dictionary during iteration
|
||||
keys_to_delete = [key for key in self.cache if key.startswith(prefix)]
|
||||
for key in keys_to_delete:
|
||||
del self.cache[key]
|
||||
|
||||
@staticmethod
|
||||
def form_cache_key(address: str, key: str):
|
||||
return address + key
|
Loading…
Add table
Add a link
Reference in a new issue