Loading proto/pathcompextended.proto +15 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading src/nbi/service/pathcompextended/Resources.py +16 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading src/pathcompextended/client/PathCompExtendedClient.py +6 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading src/pathcompextended/connector/transport_network_slice_l3.py +10 −3 Original line number Diff line number Diff line Loading @@ -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( Loading src/pathcompextended/connector/transport_optical_slice.py +7 −3 Original line number Diff line number Diff line Loading @@ -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 Loading
proto/pathcompextended.proto +15 −2 Original line number Diff line number Diff line Loading @@ -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); Loading Loading @@ -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; Loading
src/nbi/service/pathcompextended/Resources.py +16 −8 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading
src/pathcompextended/client/PathCompExtendedClient.py +6 −6 Original line number Diff line number Diff line Loading @@ -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 Loading Loading @@ -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 Loading Loading @@ -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 Loading
src/pathcompextended/connector/transport_network_slice_l3.py +10 −3 Original line number Diff line number Diff line Loading @@ -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( Loading
src/pathcompextended/connector/transport_optical_slice.py +7 −3 Original line number Diff line number Diff line Loading @@ -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