diff --git a/.gitignore b/.gitignore index ab3e8ce..3101d2b 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,15 @@ # ---> Python +# ignore IDE files +.vscode +.idea +venv.* +.repo +.git +.git_shadow + +# ignore folders +protos + # Byte-compiled / optimized / DLL files __pycache__/ *.py[cod] diff --git a/frostfs_api/client/frostfs_client.py b/frostfs_api/client/frostfs_client.py new file mode 100644 index 0000000..655f218 --- /dev/null +++ b/frostfs_api/client/frostfs_client.py @@ -0,0 +1,23 @@ +# Create channel and Stubs +import grpc +from frostfs_api.client.services.container import ContainerClient + + +class FrostfsClient: + def __init__(self, address): + self.channel = grpc.insecure_channel(address) + self.container = ContainerClient(self.channel) + + def close(self): + self.channel.close() + + +if __name__ == "__main__": + client = FrostfsClient("localhost:50051") + create_response = client.container.create_container("my_container") + print("Container created:", create_response) + + get_response = client.container.get_container(create_response) + print("Container details:", get_response) + + client.close() diff --git a/frostfs_api/client/services/container.py b/frostfs_api/client/services/container.py new file mode 100644 index 0000000..b93a336 --- /dev/null +++ b/frostfs_api/client/services/container.py @@ -0,0 +1,20 @@ +# implementation Conainer methods +import grpc +import protos.models.container.service_pb2_grpc as service_pb2_grpc_container +import protos.models.container.service_pb2 as service_pb2_container + + + +class ContainerClient: + def __init__(self, channel): + self.container_stub = service_pb2_grpc_container.ContainerServiceStub(channel) + + def create_container(self, container_name) -> bytes: + request = service_pb2_container.PutRequest(name=container_name) + response: service_pb2_container.PutResponse = self.container_stub.Put(request) + return response.body.container_id + + def get_container(self, container_id) -> service_pb2_container.GetResponse: + request = service_pb2_container.GetRequest(id=container_id) + response: service_pb2_container.GetResponse = self.container_stub.Get(request) + return response diff --git a/generate_proto.sh b/generate_proto.sh new file mode 100755 index 0000000..ba594f4 --- /dev/null +++ b/generate_proto.sh @@ -0,0 +1,36 @@ +#!/bin/bash + +# TODO: add to MakeFile +# chmod +x generate_proto.sh +# ./generate_proto.sh + + +# Define directories +PROTOS_DIR="./protos" +SOURCE_DIR="${PROTOS_DIR}/source" +MODELS_DIR="${PROTOS_DIR}/models" +REPO_FROSTFS_API_PROTOS="https://git.frostfs.info/TrueCloudLab/frostfs-api.git" + +rm -rf "$PROTOS_DIR" + +# Step 1: Create folder ./protos +echo "1. Create folder ./protos" +mkdir -p "$PROTOS_DIR" + +# Step 2: Cloning repository into ./protos/source +echo "2. Cloning repository into ./protos/source..." +mkdir -p "$SOURCE_DIR" +git clone "$REPO_FROSTFS_API_PROTOS" "$SOURCE_DIR" + +# Step 3: Generating Python code from .proto files +echo "3. Generating Python code from .proto files to $MODELS_DIR" +mkdir -p "$MODELS_DIR" +find "$SOURCE_DIR" -name "*.proto" | while read -r proto_file; do + python -m grpc_tools.protoc -I "$SOURCE_DIR" --python_out="$MODELS_DIR" --pyi_out="$MODELS_DIR" --grpc_python_out="$MODELS_DIR" "$proto_file" +done + +# Step 4: Making ./protos/models a Python package +echo "4. Making ./protos/models a Python package..." +touch "$MODELS_DIR/__init__.py" + +echo "All steps completed successfully." \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2d8c473..0b734ec 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,4 +1,6 @@ base58==2.1.1 ecdsa==0.19.0 +grpcio==1.70.0 +grpcio-tools==1.70.0 pytest==8.3.4