From 8f9b50d80abb2453eb0747efb10a3a182cd2ed4a Mon Sep 17 00:00:00 2001 From: "sunil.n" Date: Fri, 31 Oct 2025 13:57:12 +0530 Subject: [PATCH] 3GPP 28.532 RAN NSSMF subscribe API Implementation Change-Id: I16a94207165803abfa0b3cd385c0d62b957daf80 Signed-off-by: sunil.n --- .../rapp-ran-nssmf-simulator/README.md | 71 +++++++++++++++++++++- .../controller/FileDataReportingMnSController.java | 52 ++++++++++++++++ .../ran/nssmf/simulator/dto/SubscriptionDTO.java | 16 +++++ .../simulator/dto/SubscriptionRequestDTO.java | 19 ++++++ 4 files changed, 157 insertions(+), 1 deletion(-) create mode 100644 sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java create mode 100644 sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java create mode 100644 sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/README.md b/sample-rapp-generator/rapp-ran-nssmf-simulator/README.md index 8b031a4..e9d7f2d 100644 --- a/sample-rapp-generator/rapp-ran-nssmf-simulator/README.md +++ b/sample-rapp-generator/rapp-ran-nssmf-simulator/README.md @@ -2,7 +2,76 @@ 5G RAN NSSMF Simulator Rapp implements 5G RAN NSSMF Interfaces for subscriptions, NSSI creation, modifiction, get and delete apis according to 3GPP 28.532 +## API Documentation + +### File Data Reporting Subscription API + +#### Endpoint +- **URL**: `http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions` +- **Method**: `POST` +- **Content-Type**: `application/json` + +#### Request Body +```json +{ + "consumerReference": "https://callback-url.com/notifications" +} +``` + +**Request Validation:** +- `consumerReference` is required and cannot be null or empty +- Must be a valid URL for receiving callback notifications + +#### Response +**Status Code**: `201 Created` +**Headers**: +- `Location`: URL of the created subscription resource + +**Response Body:** +```json +{ + "consumerReference": "https://callback-url.com/notifications" +} +``` + +#### Functionality +- Creates a new subscription for file data reporting notifications +- Generates a unique subscription ID automatically +- Stores subscription details in memory +- Returns the subscription location in the `Location` header +- Logs all subscription operations for debugging + +#### Example Usage + +**cURL Command:** +```bash +curl -X POST \ + http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions \ + -H 'Content-Type: application/json' \ + -d '{ + "consumerReference": "https://my-callback-service.com/webhook" + }' +``` + +**Example Response:** +```http +HTTP/1.1 201 Created +Location: http://localhost:8080/3GPPManagement/FileDataReportingMnS/v17.0.0/subscriptions/1 +Content-Type: application/json + +{ + "consumerReference": "https://my-callback-service.com/webhook" +} +``` + +#### Implementation Details +- **Subscription Storage**: In-memory HashMap (subscriptionMap) +- **ID Generation**: Sequential integer starting from 1 +- **3GPP Version**: v17.0.0 +- **Server Port**: 8080 +- **Logging**: Comprehensive logging for all operations + Directory Structure src - contains source code for the Rapp -Dockerfile - contains instructions to build a Docker image for the Rapp \ No newline at end of file +Dockerfile - contains instructions to build a Docker image for the Rapp diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java new file mode 100644 index 0000000..273cdd0 --- /dev/null +++ b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/controller/FileDataReportingMnSController.java @@ -0,0 +1,52 @@ +package org.oransc.ran.nssmf.simulator.controller; + +import jakarta.servlet.http.HttpServletRequest; +import jakarta.validation.Valid; +import lombok.RequiredArgsConstructor; +import org.oransc.ran.nssmf.simulator.dto.SubscriptionDTO; +import org.oransc.ran.nssmf.simulator.dto.SubscriptionRequestDTO; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.http.ResponseEntity; +import org.springframework.scheduling.annotation.EnableScheduling; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import java.net.URI; +import java.util.HashMap; +import java.util.Map; + +@RestController +@RequestMapping("/3GPPManagement/FileDataReportingMnS/${mns.fileDataReporting.version}") +@EnableScheduling +@RequiredArgsConstructor +public class FileDataReportingMnSController { + + private static final Logger logger = LoggerFactory.getLogger(FileDataReportingMnSController.class); + + Map subscriptionMap = new HashMap<>(); + static int subscriptionId = 0; + + @PostMapping("/subscriptions") + public ResponseEntity subscribe(HttpServletRequest httpRequest, @Valid @RequestBody SubscriptionRequestDTO request) + throws Exception { + logger.info("Received new subscription request: {}", request); + + subscriptionId = subscriptionId + 1; + logger.info("Generated subscription ID: {}", subscriptionId); + + subscriptionMap.put(subscriptionId, request); + logger.info("Stored subscription in map. Total subscriptions: {}", subscriptionMap.size()); + + SubscriptionDTO subscriptionDTO = new SubscriptionDTO(); + subscriptionDTO.setCallbackUri(request.getCallbackUri()); + URI location = URI.create(httpRequest.getRequestURL().toString() + "/" + subscriptionId); + + logger.info("Successfully created subscription with ID: {} and callback URI: {}", + subscriptionId, request.getCallbackUri()); + + return ResponseEntity.created(location).body(subscriptionDTO); + } +} diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java new file mode 100644 index 0000000..6ae55e5 --- /dev/null +++ b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionDTO.java @@ -0,0 +1,16 @@ +package org.oransc.ran.nssmf.simulator.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Data +public class SubscriptionDTO { + @JsonProperty("consumerReference") + private String callbackUri; +} \ No newline at end of file diff --git a/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java new file mode 100644 index 0000000..421ed63 --- /dev/null +++ b/sample-rapp-generator/rapp-ran-nssmf-simulator/ran-nssmf-simulator/src/main/java/org/oransc/ran/nssmf/simulator/dto/SubscriptionRequestDTO.java @@ -0,0 +1,19 @@ +package org.oransc.ran.nssmf.simulator.dto; + +import com.fasterxml.jackson.annotation.JsonProperty; +import jakarta.validation.constraints.NotBlank; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +@NoArgsConstructor +@AllArgsConstructor +@Builder +@Data +public class SubscriptionRequestDTO { + + @NotBlank(message = "Not allow null or empty to 'consumerReference'") + @JsonProperty("consumerReference") + private String callbackUri; +} -- 2.16.6