[#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:13:48 +03:00
parent 19282f13cc
commit 297e107b10
52 changed files with 1380 additions and 74 deletions

View file

@ -0,0 +1,29 @@
from dataclasses import dataclass, field
from typing import Dict, Optional
import uuid
from frostfs_sdk.models.dto.owner_id import OwnerId
from frostfs_sdk.models.dto.version import Version
from frostfs_sdk.models.enums.basic_acl import BasicAcl
from frostfs_sdk.models.dto.placement_policy import PlacementPolicy
@dataclass
class Container:
# basicAcl: BasicAcl # TODO: will remove it?
placementPolicy: PlacementPolicy
nonce: uuid.UUID = field(default_factory=uuid.uuid4)
version: Optional[Version] = None
owner_id: Optional[OwnerId] = None
attributes: Dict[str, str] = field(default_factory=dict)
def __init__(self, placementPolicy: PlacementPolicy):
self.nonce = uuid.uuid4()
self.placementPolicy = placementPolicy
self.attributes = {}
@dataclass
class ContainerId:
value: str

View file

@ -0,0 +1,14 @@
from dataclasses import dataclass
from frostfs_sdk.models.enums.filter_operation import FilterOperation
@dataclass(frozen=True)
class Filter:
"""
Data Transfer Object for Filter configuration
"""
name: str
key: str
operation: FilterOperation
value: str

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

@ -0,0 +1,21 @@
from base58 import b58decode
from dataclasses import dataclass
@dataclass(frozen=True)
class OwnerId:
value: str
def __post_init__(self):
if not self.value or self.value.strip() == "":
raise ValueError(f"{self.__class__.__name__} value is not present")
def to_hash(self) -> bytes:
"""Decodes the Base58-encoded value into a byte array."""
try:
return b58decode(self.value)
except Exception as e:
raise ValueError(f"Failed to decode Base58 value: {self.value}") from e
def __str__(self) -> str:
return self.value

View file

@ -0,0 +1,14 @@
from dataclasses import dataclass
from typing import List
from frostfs_sdk.models.dto.replica import Replica
from frostfs_sdk.models.dto.selector import Selector
from frostfs_sdk.models.dto.filter import Filter
@dataclass
class PlacementPolicy:
replicas: List[Replica]
unique: bool
backup_factory: int
filters: List[Filter] = None
selectors: List[Selector] = None

View file

@ -0,0 +1,12 @@
from dataclasses import dataclass, field
EMPTY_STRING = ""
@dataclass
class Replica:
count: int
selector: str = field(default=EMPTY_STRING)
def __post_init__(self):
self.selector = self.selector if self.selector else EMPTY_STRING

View file

@ -0,0 +1,15 @@
from dataclasses import dataclass
from frostfs_sdk.models.enums.selector_clause import SelectorClause
@dataclass(frozen=True)
class Selector:
"""
Data Transfer Object for Selector configuration
"""
name: str
count: int
clause: SelectorClause
attribute: str
filter: str

View file

@ -0,0 +1,19 @@
from dataclasses import dataclass
DEFAULT_MAJOR_VERSION = 2
DEFAULT_MINOR_VERSION = 13
@dataclass(frozen=True)
class Version:
major: int = DEFAULT_MAJOR_VERSION
minor: int = DEFAULT_MINOR_VERSION
def __str__(self) -> str:
return f"v{self.major}.{self.minor}"
def is_supported(self, other):
if not isinstance(other, Version):
return False
return self.major == other.major