Commit 3de14e4a authored by Pablo Armingol's avatar Pablo Armingol
Browse files

feat: Standardize optical slice UUID usage, transition device deletion to...

feat: Standardize optical slice UUID usage, transition device deletion to direct HTTP, and improve media channel request logging.
parent f424819b
Loading
Loading
Loading
Loading
+52 −50
Original line number Diff line number Diff line
@@ -31,7 +31,7 @@ class MediaChannelService(Resource):
        LOGGER.info("Received POST request for allocationId: %s", allocationId)

        data = request.get_json()
        LOGGER.info("Request data: %s", data)
        LOGGER.info("Media Channel data: %s", json.dumps(data, indent=2))

        # Validate required fields and their types (following proto format)
        required_str_fields = ['input_sip', 'output_sip', 'uuid', 'tenant_uuid', 'direction',
@@ -138,10 +138,13 @@ class MediaChannelService(Resource):

    def delete(self, allocationId: str):
        LOGGER.info("Received DELETE request for allocationId: %s", allocationId)
        
        data = request.get_json() or {}
        service_uuid = data.get('uuid', allocationId)
        
        aux = None
        if ":" in allocationId:
            aux = allocationId.split(":")
            optical_slice = aux[0]
            service_uuid = aux[1]
        else:
            service_uuid = allocationId
        # Delete TFS Service
        try:
            from common.proto.context_pb2 import ServiceId
@@ -158,25 +161,24 @@ class MediaChannelService(Resource):
            LOGGER.error("Failed to delete TFS service: %s", str(e), exc_info=True)
            return {'status': 'error', 'message': f'Failed to delete TFS service: {str(e)}'}, 500

        # Optionally delete from device if device_id is provided
        device_id_str = data.get('device_id')
        if device_id_str:
            LOGGER.info("Processing device_id for deletion: %s", device_id_str)
        headers = {
                    "Content-Type": "application/json",
                    "Expect": ""
                }
        try:
                device = Device()
                device.device_id.device_uuid.uuid = device_id_str
                
                # Create DELETE config rule
                config_rule = ConfigRule()
                config_rule.action = ConfigActionEnum.CONFIGACTION_DELETE
                config_rule.custom.resource_key = f'/media_channel/service/{service_uuid}'
                
                device.device_config.config_rules.append(config_rule)
                self.device_client.ConfigureDevice(device)
                LOGGER.info("Deleted media channel from device %s", device_id_str)
            if aux is not None:
                url = f'http://11.1.1.101:4900/{optical_slice}/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context/connectivity-service={service_uuid}'
                # response = requests.delete(url, headers=headers, timeout=10)
                LOGGER.info("Deleted media channel from device %s: %s", optical_slice, url)
            else:
                url = f'http://11.1.1.101:4900/restconf/data/tapi-common:context/tapi-connectivity:connectivity-context/connectivity-service={service_uuid}'
                # response = requests.delete(url, headers=headers, timeout=10)
                LOGGER.info("Deleted media channel from device %s: %s", service_uuid, url)

        except Exception as e:
            LOGGER.warning("Failed to delete from device: %s", str(e))
            return {'status': 'error', 'message': f'Failed to delete from device: {str(e)}'}, 500


        return {
            'status': 'success',
+40 −51
Original line number Diff line number Diff line
@@ -43,13 +43,10 @@ class OpticalSliceService(Resource):
            return {'status': 'error', 'message': 'Missing tapi-common:context'}, 400

        # Extract key information
        context_uuid = context.get('uuid')
        context_name = context.get('name', [{}])[0].get('value', sliceId)
        slice_uuid = context.get('uuid')
        service_interface_points = context.get('service-interface-point', [])
        topology_context = context.get('tapi-topology:topology-context', {})

        LOGGER.info(f"Context UUID: {context_uuid}")
        LOGGER.info(f"Context Name: {context_name}")
        LOGGER.info(f"Service Interface Points: {len(service_interface_points)}")

        # Create TFS Service (without config rules) to show in WebUI
@@ -59,7 +56,7 @@ class OpticalSliceService(Resource):
            service.service_id.context_id.context_uuid.uuid = "admin"  # Use admin context, not tenant_uuid
            service.service_type = ServiceTypeEnum.SERVICETYPE_TAPI_CONNECTIVITY_SERVICE
            service.service_status.service_status = ServiceStatusEnum.SERVICESTATUS_ACTIVE
            service.name = f"OpticalSlice-{context_name}"
            service.name = f"OpticalSlice-{slice_uuid}"

            # Create service in TFS
            service_response = self.service_client.CreateService(service)
@@ -78,7 +75,7 @@ class OpticalSliceService(Resource):
            # Create config rule with optical slice data
            config_rule = ConfigRule()
            config_rule.action = ConfigActionEnum.CONFIGACTION_SET
            config_rule.custom.resource_key = f'/optical_slice/context/{context_uuid}'
            config_rule.custom.resource_key = f'/optical_slice/context/{slice_uuid}'

            # Store the entire TAPI context as resource value (URL will be extracted in driver)
            config_rule.custom.resource_value = json.dumps(data)
@@ -96,53 +93,45 @@ class OpticalSliceService(Resource):
            'status': 'success',
            'message': f'Optical slice created for {sliceId}',
            'sliceId': sliceId,
            'context_uuid': context_uuid
            'slice_uuid': slice_uuid
        }, 201

    def delete(self, sliceId: str):
        LOGGER.info("Received DELETE request for optical slice: %s", sliceId)

        data = request.get_json() or {}
        context_uuid = data.get('context_uuid', sliceId)
        
        # Delete TFS Service
        try:
            from common.proto.context_pb2 import ServiceId

            service_id = ServiceId()
            service_id.service_uuid.uuid = sliceId
            service_id.context_id.context_uuid.uuid = "admin"  # Use admin context
            service_id.context_id.context_uuid.uuid = "admin"

            # Delete service from TFS
            self.service_client.DeleteService(service_id)
            LOGGER.info("Deleted TFS optical slice service: %s", sliceId)
            LOGGER.info("Deleted TFS service: %s", sliceId)

        except Exception as e:
            LOGGER.error("Failed to delete TFS optical slice service: %s", str(e), exc_info=True)
            return {'status': 'error', 'message': f'Failed to delete TFS service: {str(e)}'}, 500

        # Optionally delete from device
        device_id_str = data.get('device_id', 'TFS-TAPI')
        if device_id_str:
        headers = {
                    "Content-Type": "application/json",
                    "Expect": ""
                }
        try:
                device = Device()
                device.device_id.device_uuid.uuid = device_id_str
                
                # Create DELETE config rule
                config_rule = ConfigRule()
                config_rule.action = ConfigActionEnum.CONFIGACTION_DELETE
                config_rule.custom.resource_key = f'/optical_slice/context/{context_uuid}'
                
                device.device_config.config_rules.append(config_rule)
                self.device_client.ConfigureDevice(device)
                LOGGER.info("Deleted optical slice from device %s", device_id_str)
            url = f'http://11.1.1.101:4900/restconf/data/tapi-common:context={sliceId}'
            # response = requests.delete(url, headers=headers, timeout=10)
            LOGGER.info("Deleted optical slice from device %s: %s", sliceId, url)

        except Exception as e:
            LOGGER.warning("Failed to delete from device: %s", str(e))
            return {'status': 'error', 'message': f'Failed to delete from device: {str(e)}'}, 500


        return {
            'status': 'success',
            'message': f'Optical slice deleted for {sliceId}',
            'message': f'Optical Slice deleted for {sliceId}',
            'sliceId': sliceId,
            'context_uuid': context_uuid
            'service_uuid': sliceId
        }, 200