Commit 127883bd authored by Antonio Gines Buendia Lopez's avatar Antonio Gines Buendia Lopez
Browse files

Fix gRPC stream timeout on NBI. Modify gRPC to not need stream

parent 44917d70
Loading
Loading
Loading
Loading
+15 −2
Original line number Diff line number Diff line
@@ -34,13 +34,13 @@ service PathCompExtendedService {
  // Transport Optical Slice
  rpc CreateTransportOpticalSlice (IetfNetworkSlice) returns (TransportOpticalSlice);
  rpc DeleteTransportOpticalSlice (UUID) returns (GenericMessage);
  rpc GetTransportOpticalSlices (google.protobuf.Empty) returns (stream TransportOpticalSlice);
  rpc GetTransportOpticalSlices (google.protobuf.Empty) returns (TransportOpticalSlicesResponse);
  rpc GetTransportOpticalSlice (UUID) returns (TransportOpticalSlice);

  // Transport Network Slice L3
  rpc CreateTransportNetworkSliceL3 (IetfNetworkSlice) returns (TransportNetworkSliceL3);
  rpc DeleteTransportNetworkSliceL3 (UUID) returns (GenericMessage);
  rpc GetTransportNetworkSlicesL3 (google.protobuf.Empty) returns (stream TransportNetworkSliceL3);
  rpc GetTransportNetworkSlicesL3 (google.protobuf.Empty) returns (TransportNetworkSlicesL3Response);
  rpc GetTransportNetworkSliceL3 (UUID) returns (TransportNetworkSliceL3);


@@ -82,6 +82,19 @@ message TransportNetworkSliceL3 {
  string raw_actions_json = 4;
}

// Wrapper responses (matches H-RAT format: message, total, data)
message TransportOpticalSlicesResponse {
  string message = 1;
  int32 total = 2;
  repeated TransportOpticalSlice data = 3;
}

message TransportNetworkSlicesL3Response {
  string message = 1;
  int32 total = 2;
  repeated TransportNetworkSliceL3 data = 3;
}

// Generic
message LivenessProbe{
  bool alive = 1;
+16 −8
Original line number Diff line number Diff line
@@ -194,10 +194,14 @@ class TransportOpticalSlice(_Resource):
    def get(self):
        LOGGER.info("Operation GET /transport-optical-slice")
        try:
            slices = self.pathcompextended_client.GetTransportOpticalSlices(None)
            result = [_transport_optical_slice_to_hrat(s) for s in slices]
            LOGGER.debug("Retrieved %d transport optical slices", len(result))
            return result
            response = self.pathcompextended_client.GetTransportOpticalSlices(None)
            data = [_transport_optical_slice_to_hrat(s) for s in response.data]
            LOGGER.debug("Retrieved %d transport optical slices", len(data))
            return {
                "total": response.total,
                "data": data,
                "message": response.message,
            }
        except Exception as e:
            LOGGER.error("Error getting transport optical slices: %s", e, exc_info=True)
            return {"error": str(e)}, 500
@@ -264,10 +268,14 @@ class TransportNetworkSliceL3(_Resource):
    def get(self):
        LOGGER.info("Operation GET /transport-network-slice-l3")
        try:
            slices = self.pathcompextended_client.GetTransportNetworkSlicesL3(None)
            result = [_transport_network_slice_l3_to_hrat(s) for s in slices]
            LOGGER.debug("Retrieved %d transport network slices L3", len(result))
            return result
            response = self.pathcompextended_client.GetTransportNetworkSlicesL3(None)
            data = [_transport_network_slice_l3_to_hrat(s) for s in response.data]
            LOGGER.debug("Retrieved %d transport network slices L3", len(data))
            return {
                "total": response.total,
                "data": data,
                "message": response.message,
            }
        except Exception as e:
            LOGGER.error("Error getting transport network slices L3: %s", e, exc_info=True)
            return {"error": str(e)}, 500
+6 −6
Original line number Diff line number Diff line
@@ -13,13 +13,13 @@
# limitations under the License.

import grpc, logging
from typing import Iterator
from common.Constants import ServiceNameEnum
from common.Settings import get_service_host, get_service_port_grpc
from common.proto.context_pb2 import Empty
from common.proto.pathcompextended_pb2 import (
    IetfNetworkSlice, LivenessProbe, NetworkContext, NetworkTopology,
    TransportNetworkSliceL3, TransportOpticalSlice, UUID, GenericMessage
    TransportNetworkSliceL3, TransportNetworkSlicesL3Response,
    TransportOpticalSlice, TransportOpticalSlicesResponse, UUID, GenericMessage
)
from common.proto.pathcompextended_pb2_grpc import PathCompExtendedServiceStub
from common.tools.client.RetryDecorator import retry, delay_exponential
@@ -126,12 +126,12 @@ class PathCompExtendedClient:
        return response

    @RETRY_DECORATOR
    def GetTransportOpticalSlices(self, request: Empty = None) -> Iterator[TransportOpticalSlice]:
    def GetTransportOpticalSlices(self, request: Empty = None) -> TransportOpticalSlicesResponse:
        if request is None:
            request = Empty()
        LOGGER.debug('GetTransportOpticalSlices request')
        response = self.stub.GetTransportOpticalSlices(request)
        LOGGER.debug('GetTransportOpticalSlices result: {:s}'.format(grpc_message_to_json_string(response)))
        LOGGER.debug('GetTransportOpticalSlices result: {:d} items'.format(len(response.data)))
        return response

    @RETRY_DECORATOR
@@ -160,12 +160,12 @@ class PathCompExtendedClient:
        return response

    @RETRY_DECORATOR
    def GetTransportNetworkSlicesL3(self, request: Empty = None) -> Iterator[TransportNetworkSliceL3]:
    def GetTransportNetworkSlicesL3(self, request: Empty = None) -> TransportNetworkSlicesL3Response:
        if request is None:
            request = Empty()
        LOGGER.debug('GetTransportNetworkSlicesL3 request')
        response = self.stub.GetTransportNetworkSlicesL3(request)
        LOGGER.debug('GetTransportNetworkSlicesL3 result: {:s}'.format(grpc_message_to_json_string(response)))
        LOGGER.debug('GetTransportNetworkSlicesL3 result: {:d} items'.format(len(response.data)))
        return response

    @RETRY_DECORATOR
+10 −3
Original line number Diff line number Diff line
@@ -68,10 +68,17 @@ class TransportNetworkSliceL3API:

        LOGGER.debug("Response from HRAT: %s - %s", res.status_code, res.text)

        # The API returns a UUID string directly
        uuid_response = res.text.strip('"')
        # H-RAT returns full JSON object {transport-network-slice-l3-uuid, optical-slice-uuid, ...} or just UUID string
        data = res.json()
        if isinstance(data, str):
            transport_network_slice_l3_uuid = data.strip('"')
        else:
            transport_network_slice_l3_uuid = (
                data.get("transport-network-slice-l3-uuid")
                or data.get("transport_network_slice_l3_uuid", "")
            )
        return TransportNetworkSliceL3PostResponse(
            transport_network_slice_l3_uuid=uuid_response
            transport_network_slice_l3_uuid=transport_network_slice_l3_uuid
        )

    def get_transport_network_slice_l3(
+7 −3
Original line number Diff line number Diff line
@@ -68,9 +68,13 @@ class TransportOpticalSliceAPI:

        LOGGER.debug("Response from HRAT: %s - %s", res.status_code, res.text)

        # The API returns a UUID string directly
        uuid_response = res.text.strip('"')
        return TransportOpticalSlicePostResponse(optical_slice_uuid=uuid_response)
        # H-RAT returns full JSON object {optical-slice-uuid, viability, actions} or just UUID string
        data = res.json()
        if isinstance(data, str):
            optical_slice_uuid = data.strip('"')
        else:
            optical_slice_uuid = data.get("optical-slice-uuid") or data.get("optical_slice_uuid", "")
        return TransportOpticalSlicePostResponse(optical_slice_uuid=optical_slice_uuid)

    def get_transport_optical_slice(
        self, uuid: str
Loading