From 46d9e94d361324e10dc474de0e794e9362506f1e Mon Sep 17 00:00:00 2001 From: XunliYang Date: Sun, 28 Sep 2025 10:52:55 +0800 Subject: [PATCH 01/13] Add Meeting minutes MOM-2025-09-26 --- .../MeetingMinutes/MOM-2025-07-18.md | 2 +- .../MeetingMinutes/MOM-2025-09-26.md | 46 +++++++++++++++++++ 2 files changed, 47 insertions(+), 1 deletion(-) create mode 100644 documentation/MeetingMinutes/MOM-2025-09-26.md diff --git a/documentation/MeetingMinutes/MOM-2025-07-18.md b/documentation/MeetingMinutes/MOM-2025-07-18.md index 32641e5..2466294 100644 --- a/documentation/MeetingMinutes/MOM-2025-07-18.md +++ b/documentation/MeetingMinutes/MOM-2025-07-18.md @@ -1,4 +1,4 @@ -# CAMARA Network Slice Booking Meeting - MOM-2025-07-018 +# CAMARA Network Slice Booking Meeting - MOM-2025-07-18 *Friday, July 18th, 2025* diff --git a/documentation/MeetingMinutes/MOM-2025-09-26.md b/documentation/MeetingMinutes/MOM-2025-09-26.md new file mode 100644 index 0000000..80a4dc3 --- /dev/null +++ b/documentation/MeetingMinutes/MOM-2025-09-26.md @@ -0,0 +1,46 @@ +# CAMARA Network Slice Booking Meeting - MOM-2025-09-26 + + +*Friday, Sep 26th, 2025* + + +## Attendees +* Xunli Yang (Huawei) +* Xiao Dongrui (China Unicom) +* Rafal Artych (DT) + + +## Agenda +* The API is about to be released(Thanks for everyone's great work!) +* Discuss the plan for the next version in Spring26: + * Issue#81 discussion - [Generic422 error rename to be more explicit](https://github.com/camaraproject/NetworkSliceBooking/issues/81). + * Issue#82 discussion - [Add tests for polygon area validation limits (between 3-15 points)](https://github.com/camaraproject/NetworkSliceBooking/issues/82). + * Issue#83 discussion - [Add corresponding tests on x-correlator parameters](https://github.com/camaraproject/NetworkSliceBooking/issues/83). + * Issue#84 discussion - [Add asynchronous callback in the createSession operation](https://github.com/camaraproject/NetworkSliceBooking/issues/84). +* Free discussion +* AOB + + +## Issues Discussions +* Meta-release Fall25 + * Network-slice-booking v0.1.0 is about to be released in Fall25. + * Keep an eye on the possible release schedule for future versions, ref:[Proposal to Adopt a Dual-Phase Meta-Release Cadence for CAMARA APIs #194](https://github.com/camaraproject/Governance/issues/194) +* Issue#81 discussion + * Split the 422 error with "service area is not supported" error and "resources are insufficient" error. + * Optional change: + * `NetworkSliceBooking422` -> `SERVICEAREA_NOT_SUPPORTED` for "service area is not supported" error. + * `NetworkSliceBooking422` -> `RESOURCES_INSUFFICIENT` for "resources are insufficient" error. +* Issue#82 discussion + * Add tests for polygon area validation limits (between 3-15 points). +* Issue#83 discussion + * Add corresponding tests on x-correlator parameters + * To be clarified: whether to add schenarios for inconsistent x-correlator in request and response. +* Issue#84 discussion + * Plan to add asynchronous callback in the next release. + * To be discussed: notification API. +* Free discussion + * Plan to release this part of API in the next release(Spring26). + + +## AOB +1. The next call will be on Friday, 10th Oct, 16:00 CST / 10:00 CET From fdd176cf3ba7fc9081dfa6aadfe2868b988c95e4 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Thu, 23 Oct 2025 17:14:58 +0800 Subject: [PATCH 02/13] Add network-slice-assignment API --- .../network-slice-assignment.yaml | 1449 +++++++++++++++++ 1 file changed, 1449 insertions(+) create mode 100644 code/API_definitions/network-slice-assignment.yaml diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml new file mode 100644 index 0000000..610850a --- /dev/null +++ b/code/API_definitions/network-slice-assignment.yaml @@ -0,0 +1,1449 @@ +openapi: 3.0.3 +info: + title: Network Slice Assignment + description: | + This API enables the assignment and release of devices to/from an existing network slice session, as well as retrieving information about devices assigned to a session or sessions assigned to a device. + + # Functionality + The Network Slice Assignment API provides the following functionalities: + - **Assign Devices**: Allows the API consumer to assign multiple devices to an existing network slice session, ensuring that the number of devices does not exceed the maximum defined in the slice QoS profile. + - **Release Devices**: Enables the API consumer to release multiple devices from an existing network slice session. + - **Get Assigned Devices**: Retrieves information about devices currently assigned to a specific network slice session. + - **Retrieve Sessions by Device**: Retrieves the list of network slice sessions to which a specific device is assigned. + + # Terms and Definitions + + * **Device**: End-user equipment able to connect to a mobile network. Examples of devices include smartphones or IoT sensors/actuators. + * **Identifier for Device**: The developer can choose to provide one or more of the following device identifiers: + - `ipv4Address` + - `ipv6Address` + - `phoneNumber` + - `networkAccessIdentifier` + NOTE1: the network operator might support only a subset of these options. The API invoker can provide multiple identifiers to be compatible across different network operators. In this case the identifiers MUST belong to the same device. + NOTE2: NetworkAccessIdentifier is defined for future use and will not be currently supported with v0.1 of the API. + * **Notification Sink and Token**: + API consumers can provide a notification sink URL and an optional sink credential when assigning devices to a session. The notification sink is the URL where the API response will be asynchronously delivered, using the HTTP protocol. The sink credential provides authentication or authorization information necessary to enable delivery of events to the target. + + # Parameters + + * **sliceQosProfile**: A set of quality of service parameters that define the requirements for the network slice. It includes parameters such as maximum number of devices, downlink and uplink throughput per device, and latency requirements. + * **sessionId**: A unique identifier for a network slice session, obtained from the createSession operation of the Network Slice Booking API. + + # Authorization and authentication + + The "Camara Security and Interoperability Profile" provides details of how an API consumer requests an access token. Please refer to Identity and Consent Management (https://github.com/camaraproject/IdentityAndConsentManagement/) for the released version of the profile. + + The specific authorization flows to be used will be agreed upon during the onboarding process, happening between the API consumer and the API provider, taking into account the declared purpose for accessing the API, whilst also being subject to the prevailing legal framework dictated by local legislation. + + In cases where personal data is processed by the API and users can exercise their rights through mechanisms such as opt-in and/or opt-out, the use of three-legged access tokens is mandatory. This ensures that the API remains in compliance with privacy regulations, upholding the principles of transparency and user-centric privacy-by-design. + + # Additional CAMARA error responses + + The list of error codes in this API specification is not exhaustive. Therefore the API specification may not document some non-mandatory error statuses as indicated in `CAMARA API Design Guide`. + + Please refer to the `CAMARA_common.yaml` of the Commonalities Release associated to this API version for a complete list of error responses. The applicable Commonalities Release can be identified in the `API Readiness Checklist` document associated to this API version. + + As a specific rule, error `501 - NOT_IMPLEMENTED` can be only a possible error response if it is explicitly documented in the API. + + version: 0.1.0 + x-camara-commonalities: 0.6 + license: + name: Apache 2.0 + url: https://www.apache.org/licenses/LICENSE-2.0.html +externalDocs: + description: Project documentation at CAMARA + url: https://github.com/camaraproject/NetworkSliceBooking +servers: + - url: "{apiRoot}/network-slice-assignment/vwip" + variables: + apiRoot: + default: http://localhost:9100 + description: API root, defined by the service provider, e.g. `api.example.com` or `api.example.com/somepath` +tags: + - name: Network Slice Assignment + description: Manage Network Slice Assignment +paths: + /sessions/{sessionId}/devices/assign: + post: + tags: + - Network Slice Assignment + summary: Assign devices to a network slice session + description: | + Assign a list of devices to an existing network slice session. + + NOTES: + - The API consumer can assign multiple devices to an existing session. + - The API consumer must ensure that the number of devices assigned does not exceed the maximum number of devices defined in the slice QoS profile of the session. + operationId: assignDevices + security: + - openId: + - network-slice-assignment:devices:create + parameters: + - name: sessionId + in: path + description: Session ID that was obtained from the createSession operation + required: true + schema: + $ref: "#/components/schemas/SessionId" + - $ref: "#/components/parameters/x-correlator" + requestBody: + description: Parameters to assign devices to a network slice session + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceInput" + examples: + ASSIGN_DEVICES_INPUT_ALL: + $ref: "#/components/examples/ASSIGN_DEVICES_INPUT_ALL" + ASSIGN_DEVICES_INPUT_NUMBER: + $ref: "#/components/examples/ASSIGN_DEVICES_INPUT_NUMBER" + required: true + callbacks: + networkSliceAssignmentSinkCallback: + "{request.body#/sink}": + post: + tags: + - Network Slice Assignment Callback + summary: Network slice assignment callback + description: Callback for network slice assignment events + operationId: postNetworkSliceAssignmentNotification + requestBody: + content: + application/cloudevents+json: + schema: + $ref: "#/components/schemas/CloudEvent" + examples: + ASSIGNMENT_COMPLETED_EVENT: + $ref: "#/components/examples/ASSIGNMENT_COMPLETED_EVENT" + required: true + responses: + "204": + description: Successful notification + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "410": + $ref: "#/components/responses/Generic410" + "429": + $ref: "#/components/responses/Generic429" + security: + - {} + - notificationsBearerAuth: [] + responses: + "201": + description: At least one device assigned to the session. + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceOutput" + examples: + ASSIGN_DEVICES_SUCCESSFUL: + $ref: "#/components/examples/ASSIGN_DEVICES_SUCCESSFUL" + ASSIGN_DEVICES_PARTIAL_SUCCESS: + $ref: "#/components/examples/ASSIGN_DEVICES_PARTIAL_SUCCESS" + ASSIGN_DEVICES_FAILURE: + $ref: "#/components/examples/ASSIGN_DEVICES_FAILURE" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" + "422": + $ref: "#/components/responses/Generic422" + "429": + $ref: "#/components/responses/Generic429" + + /sessions/{sessionId}/devices/release: + post: + tags: + - Network Slice Assignment + summary: Release devices from a network slice session + description: | + Release a list of devices from an existing network slice session. + + NOTES: + - The API consumer can release multiple devices from an existing session. + operationId: releaseDevices + security: + - openId: + - network-slice-assignment:devices:delete + parameters: + - name: sessionId + in: path + description: Session ID that was obtained from the createSession operation + required: true + schema: + $ref: "#/components/schemas/SessionId" + - $ref: "#/components/parameters/x-correlator" + requestBody: + description: Parameters to release devices from a network slice session + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceInput" + examples: + RELEASE_DEVICES_INPUT_ALL: + $ref: "#/components/examples/RELEASE_DEVICES_INPUT_ALL" + RELEASE_DEVICES_INPUT_NUMBER: + $ref: "#/components/examples/RELEASE_DEVICES_INPUT_NUMBER" + required: true + responses: + "200": + description: At least one device released from the session. + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceOutput" + examples: + RELEASE_DEVICES_SUCCESSFUL: + $ref: "#/components/examples/RELEASE_DEVICES_SUCCESSFUL" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" + "422": + $ref: "#/components/responses/Generic422" + "429": + $ref: "#/components/responses/Generic429" + + /sessions/{sessionId}/devices/get: + get: + tags: + - Network Slice Assignment + summary: Get devices assigned to a network slice session + description: | + Get information about devices assigned to an existing network slice session. + operationId: getDevices + security: + - openId: + - network-slice-assignment:devices:get + parameters: + - name: sessionId + in: path + description: Session ID that was obtained from the createSession operation + required: true + schema: + $ref: "#/components/schemas/SessionId" + - $ref: "#/components/parameters/x-correlator" + responses: + "200": + description: Contains information about active session + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/SessionDevice" + examples: + GET_DEVICES_SUCCESSFUL: + $ref: "#/components/examples/GET_DEVICES_SUCCESSFUL" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" + "429": + $ref: "#/components/responses/Generic429" + + /sessions/devices/retrieve: + post: + tags: + - Network Slice Assignment + summary: Retrieve all network slice sessions corresponds to a device + description: | + Retrieve the list of network slice sessions to which a device is assigned. + operationId: retrieveSessionsByDevice + security: + - openId: + - network-slice-assignment:devices:retrieve + parameters: + - $ref: "#/components/parameters/x-correlator" + requestBody: + description: Parameters to retrieve sessions by device + content: + application/json: + schema: + $ref: "#/components/schemas/Device" + examples: + RETRIEVE_INPUT_PHONENUMBER: + $ref: "#/components/examples/RETRIEVE_INPUT_PHONENUMBER" + required: true + responses: + "200": + description: List of sessions the device is assigned to + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/RetrievedSessionsOutput" + examples: + RETRIEVE_SUCCESSFUL: + $ref: "#/components/examples/RETRIEVE_SUCCESSFUL" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "429": + $ref: "#/components/responses/Generic429" +components: + securitySchemes: + openId: + type: openIdConnect + openIdConnectUrl: https://example.com/.well-known/openid-configuration + + parameters: + x-correlator: + name: x-correlator + in: header + description: Correlation id for the different services + schema: + $ref: "#/components/schemas/XCorrelator" + + headers: + x-correlator: + description: Correlation id for the different services + schema: + $ref: "#/components/schemas/XCorrelator" + + schemas: + XCorrelator: + description: Value for the x-correlator + type: string + pattern: ^[a-zA-Z0-9-_:;.\/<>{}]{0,256}$ + example: "b4333c46-49c0-4f62-80d7-f0ef930f1c46" + SessionId: + description: Session ID in UUID format + type: string + format: uuid + DeviceInput: + description: Request to add or release devices to a session + type: object + properties: + deviceList: + $ref: "#/components/schemas/Devices" + sink: + type: string + format: uri + description: The URL where the API response will be asynchronously delivered, using the HTTP protocol. + example: "https://endpoint.example.com/sink" + sinkCredential: + description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + allOf: + - $ref: "#/components/schemas/SinkCredential" + required: + - deviceList + Devices: + description: List of device identifiers + type: array + items: + $ref: "#/components/schemas/Device" + minItems: 1 + Device: + description: | + End-user equipment able to connect to a mobile network. Examples of devices include smartphones or IoT sensors/actuators. + The developer can choose to provide the below specified device identifiers: + * `ipv4Address` + * `ipv6Address` + * `phoneNumber` + * `networkAccessIdentifier` + NOTE1: the network operator might support only a subset of these options. The API invoker can provide multiple identifiers to be compatible across different network operators. In this case the identifiers MUST belong to the same device. + NOTE2: as for this Commonalities release, we are enforcing that the networkAccessIdentifier is only part of the schema for future-proofing, and CAMARA does not currently allow its use. After the CAMARA meta-release work is concluded and the relevant issues are resolved, its use will need to be explicitly documented in the guidelines. + type: object + properties: + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" + networkAccessIdentifier: + $ref: "#/components/schemas/NetworkAccessIdentifier" + ipv4Address: + $ref: "#/components/schemas/DeviceIpv4Addr" + ipv6Address: + $ref: "#/components/schemas/DeviceIpv6Address" + minProperties: 1 + PhoneNumber: + description: A public identifier addressing a telephone subscription. In mobile networks it corresponds to the MSISDN (Mobile Station International Subscriber Directory Number). In order to be globally unique it has to be formatted in international format, according to E.164 standard, prefixed with '+'. + type: string + pattern: '^\+[1-9][0-9]{4,14}$' + example: "+123456789" + + NetworkAccessIdentifier: + description: A public identifier addressing a subscription in a mobile network. In 3GPP terminology, it corresponds to the GPSI formatted with the External Identifier ({Local Identifier}@{Domain Identifier}). Unlike the telephone number, the network access identifier is not subjected to portability ruling in force, and is individually managed by each operator. + type: string + example: "123456789@example.com" + + DeviceIpv4Addr: + type: object + description: | + The device should be identified by either the public (observed) IP address and port as seen by the application server, or the private (local) and any public (observed) IP addresses in use by the device (this information can be obtained by various means, for example from some DNS servers). + + If the allocated and observed IP addresses are the same (i.e. NAT is not in use) then the same address should be specified for both publicAddress and privateAddress. + + If NAT64 is in use, the device should be identified by its publicAddress and publicPort, or separately by its allocated IPv6 address (field ipv6Address of the Device object) + + In all cases, publicAddress must be specified, along with at least one of either privateAddress or publicPort, dependent upon which is known. In general, mobile devices cannot be identified by their public IPv4 address alone. + properties: + publicAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + privateAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + publicPort: + $ref: "#/components/schemas/Port" + anyOf: + - required: [publicAddress, privateAddress] + - required: [publicAddress, publicPort] + example: + publicAddress: "84.125.93.10" + publicPort: 59765 + SingleIpv4Addr: + description: A single IPv4 address with no subnet mask + type: string + format: ipv4 + example: "84.125.93.10" + + Port: + description: TCP or UDP port number + type: integer + minimum: 0 + maximum: 65535 + + DeviceIpv6Address: + description: | + The device should be identified by the observed IPv6 address, or by any single IPv6 address from within the subnet allocated to the device (e.g. adding ::0 to the /64 prefix). + type: string + format: ipv6 + example: 2001:db8:85a3:8d3:1319:8a2e:370:7344 + + DeviceOutput: + description: Response after assigning devices to a session + type: object + properties: + sessionId: + $ref: "#/components/schemas/SessionId" + resultList: + $ref: "#/components/schemas/ResultList" + status: + $ref: "#/components/schemas/AssignmentStatus" + statusInfo: + $ref: "#/components/schemas/AssignmentStatusInfo" + required: + - sessionId + - status + - statusInfo + AssignmentStatus: + description: | + Status of the device assignment operation + * `SUCCESS` - All devices were successfully assigned to the session + * `PARTIALLY_SUCCESS` - Some devices were successfully assigned to the session, while others failed + * `FAILURE` - No devices were assigned to the session + * `PENDING` - The assignment operation is still in progress + type: string + enum: + - SUCCESS + - PARTIALLY_SUCCESS + - FAILURE + - PENDING + AssignmentStatusInfo: + description: | + Additional information about the assignment status + * `ASSIGNMENT_COMPLETED` - The assignment operation has been completed + * `ASSIGNMENT_COMPLETED_WITH_FAILURES` - The assignment operation has been completed with some failures + * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the session + * `INVALID_DEVICE_IDENTIFIER` - One or more device identifiers are invalid + * `DEVICE_NOT_FOUND` - One or more devices were not found + * `DEVICE_ALREADY_ASSIGNED` - One or more devices are already assigned to the session + * `SESSION_NOT_FOUND` - The specified session ID does not exist + type: string + enum: + - ASSIGNMENT_COMPLETED + - ASSIGNMENT_COMPLETED_WITH_FAILURES + - MAX_DEVICES_EXCEEDED + - INVALID_DEVICE_IDENTIFIER + - DEVICE_NOT_FOUND + - DEVICE_ALREADY_ASSIGNED + - SESSION_NOT_FOUND + ResultList: + description: List of devices that failed to be assigned to the session + type: array + items: + $ref: "#/components/schemas/AssignmentResult" + AssignmentResult: + description: Result of a device assignment attempt + type: object + properties: + device: + $ref: "#/components/schemas/Device" + result: + type: string + description: result of the assignment attempt for the device + enum: + - SUCCESS + - FAILURE + message: + type: string + description: Detailed reason for failure, if applicable + required: + - device + - result + RetrievedSessionsOutput: + description: Response containing sessions assigned to a device + type: object + properties: + sliceList: + type: array + items: + $ref: "#/components/schemas/SessionInfo" + minItems: 0 + + SessionDevice: + description: Information about devices assigned to a session + type: object + properties: + deviceList: + $ref: "#/components/schemas/Devices" + sliceInfo: + $ref: "#/components/schemas/SessionInfo" + required: + - deviceList + - sliceInfo + SessionInfo: + description: Session related information. + allOf: + - $ref: "#/components/schemas/CreateSession" + - type: object + properties: + sessionId: + $ref: "#/components/schemas/SessionId" + required: + - sessionId + CreateSession: + description: Attributes required to create a session + type: object + properties: + serviceTime: + description: | + serviceTime is a period during which the network slice will be reserved. + It is defined by a start time and an end time. + allOf: + - $ref: "#/components/schemas/TimePeriod" + serviceArea: + description: | + serviceArea is a geographical area where the network slice will be reserved. + It can be defined as a circle or a polygon. + allOf: + - $ref: "#/components/schemas/Area" + sliceQosProfile: + description: | + sliceQosProfile is a set of quality of service parameters that define the requirements for the network slice. + It includes parameters such as maximum number of devices, downlink and uplink throughput per device, and latency requirements. + allOf: + - $ref: "#/components/schemas/SliceQosProfile" + sink: + type: string + format: uri + description: The URL where the API response will be asynchronously delivered, using the HTTP protocol. + example: "https://endpoint.example.com/sink" + sinkCredential: + description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + allOf: + - $ref: "#/components/schemas/SinkCredential" + required: + - serviceTime + - serviceArea + - sliceQosProfile + + SliceQosProfile: + description: | + Quality of service for the network slice. + It includes a set of predefined network slice performance characteristics. + type: object + properties: + maxNumOfDevices: + description: | + maxNumOfDevices is a maximum number of devices that can be connected to the slice + allOf: + - $ref: "#/components/schemas/NumberOfDevices" + downStreamRatePerDevice: + description: | + downStreamRatePerDevice is the maximum downstream rate allowed for each device connected to the slice. + It indicates the individual device capability required for the slice. + allOf: + - $ref: "#/components/schemas/Rate" + upStreamRatePerDevice: + description: | + upStreamRatePerDevice is the maximum upstream rate allowed for each device connected to the slice. + It indicates the individual device capability required for the slice. + allOf: + - $ref: "#/components/schemas/Rate" + downStreamDelayBudget: + description: | + downStreamDelayBudget is the maximum allowable downlink packet transmission latency (millisecond). + By limiting the delay, the network can provide an acceptable level of performance for various services, such as voice calls, video streaming, and data. + allOf: + - $ref: "#/components/schemas/Duration" + upStreamDelayBudget: + description: | + upStreamDelayBudget is the maximum allowable uplink packet transmission latency (millisecond). + By limiting the delay, the network can provide an acceptable level of performance for various services, such as voice calls, video streaming, and data. + allOf: + - $ref: "#/components/schemas/Duration" + + + Duration: + description: Specification of duration. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#appendix-A) for duration. + type: object + properties: + value: + description: Length of duration + type: integer + example: 12 + format: int32 + minimum: 1 + unit: + $ref: "#/components/schemas/TimeUnitEnum" + + + TimeUnitEnum: + description: Units of time + type: string + enum: + - Days + - Hours + - Minutes + - Seconds + - Milliseconds + - Microseconds + - Nanoseconds + + + Rate: + description: Specification of rate + type: object + properties: + value: + description: Quantity of rate + type: integer + example: 10 + format: int32 + minimum: 0 + maximum: 1024 + unit: + $ref: "#/components/schemas/RateUnitEnum" + + RateUnitEnum: + description: Units of rate + type: string + enum: + - bps + - kbps + - Mbps + - Gbps + - Tbps + + NumberOfDevices: + type: integer + example: 5 + description: Maximum number of devices that is allowed to be connected to the network at any point in time. + + format: int32 + minimum: 1 + maximum: 20 + + TimePeriod: + properties: + startDate: + type: string + format: date-time + description: An instant of time, starting of the TimePeriod. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2024-06-01T12:00:00Z" + endDate: + type: string + format: date-time + description: An instant of time, ending of the TimePeriod. If not included, then the period has no ending date. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2024-06-02T12:00:00Z" + required: + - startDate + + Area: + description: Base schema for all areas + type: object + properties: + areaType: + $ref: "#/components/schemas/AreaType" + required: + - areaType + discriminator: + propertyName: areaType + mapping: + CIRCLE: "#/components/schemas/Circle" + POLYGON: "#/components/schemas/Polygon" + + AreaType: + type: string + description: | + Type of this area. + CIRCLE - The area is defined as a circle. + POLYGON - The area is defined as a polygon. + enum: + - CIRCLE + - POLYGON + + Circle: + description: Circular area + allOf: + - $ref: "#/components/schemas/Area" + - type: object + required: + - center + - radius + properties: + center: + $ref: "#/components/schemas/Point" + radius: + type: number + description: Distance from the center in meters + minimum: 1 + + Polygon: + description: Polygonal area. The Polygon should be a simple polygon, i.e. should not intersect itself. + allOf: + - $ref: "#/components/schemas/Area" + - type: object + required: + - boundary + properties: + boundary: + $ref: "#/components/schemas/PointList" + + PointList: + description: List of points defining a polygon + type: array + items: + $ref: "#/components/schemas/Point" + minItems: 3 + maxItems: 15 + + Point: + type: object + description: Coordinates (latitude, longitude) defining a location in a map + required: + - latitude + - longitude + properties: + latitude: + $ref: "#/components/schemas/Latitude" + longitude: + $ref: "#/components/schemas/Longitude" + example: + latitude: 31.22529 + longitude: 121.48905 + + Latitude: + description: Latitude component of a location + type: number + format: double + minimum: -90 + maximum: 90 + + Longitude: + description: Longitude component of location + type: number + format: double + minimum: -180 + maximum: 180 + + ErrorInfo: + description: Common schema for errors + type: object + properties: + status: + type: integer + description: HTTP status code returned along with this error response + code: + type: string + description: Code given to this error + message: + type: string + description: Detailed error description + required: + - status + - code + - message + + CloudEvent: + description: The notification callback + required: + - id + - source + - specversion + - type + - time + properties: + id: + type: string + description: identifier of this event, that must be unique in the source context. + minLength: 1 + source: + $ref: '#/components/schemas/Source' + type: + type: string + description: The type of the event + enum: + - "org.camaraproject.network-slice-booking.v1.session-created" + minLength: 25 + specversion: + type: string + description: Version of the specification to which this event conforms (must be 1.0 if it conforms to cloudevents 1.0.2 version) + enum: + - "1.0" + datacontenttype: + type: string + description: 'media-type that describes the event payload encoding, must be "application/json" for CAMARA APIs' + enum: + - application/json + data: + type: object + description: Event details payload described in each CAMARA API and referenced by its type + time: + $ref: "#/components/schemas/DateTime" + discriminator: + propertyName: type + mapping: + org.camaraproject.network-slice-booking.v1.session-created: "#/components/schemas/SessionCreatedEventData" + + SessionCreatedEventData: + description: Data for session created event + allOf: + - $ref: "#/components/schemas/CloudEvent" + - type: object + properties: + data: + description: Details of the created session + allOf: + - $ref: "#/components/schemas/SessionInfo" + required: + - data + + DateTime: + type: string + format: date-time + description: | + Timestamp of when the occurrence happened. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + WARN: This optional field in CloudEvents specification is required in CAMARA APIs implementation. + example: '2018-04-05T17:31:00Z' + + Source: + type: string + format: uri-reference + minLength: 1 + description: | + Identifies the context in which an event happened - be a non-empty `URI-reference` like: + - URI with a DNS authority: + * https://github.com/cloudevents + * mailto:cncf-wg-serverless@lists.cncf.io + - Universally-unique URN with a UUID: + * urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 + - Application-specific identifier: + * /cloudevents/spec/pull/123 + * 1-555-123-4567 + example: "https://notificationSendServer12.example.com" + + SinkCredential: + description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + type: object + properties: + credentialType: + type: string + enum: + - PLAIN + - ACCESSTOKEN + - REFRESHTOKEN + description: | + The type of the credential. + Note: Type of the credential - MUST be set to ACCESSTOKEN for now + discriminator: + propertyName: credentialType + mapping: + PLAIN: "#/components/schemas/PlainCredential" + ACCESSTOKEN: "#/components/schemas/AccessTokenCredential" + REFRESHTOKEN: "#/components/schemas/RefreshTokenCredential" + required: + - credentialType + PlainCredential: + type: object + description: A plain credential as a combination of an identifier and a secret. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + required: + - identifier + - secret + properties: + identifier: + description: The identifier might be an account or username. + type: string + secret: + description: The secret might be a password or passphrase. + type: string + AccessTokenCredential: + type: object + description: An access token credential. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: | + REQUIRED. An absolute (UTC) timestamp at which the token shall be considered expired. + In the case of an ACCESS_TOKEN_EXPIRED termination reason, implementation should notify the client before the expiration date. + If the access token is a JWT and registered "exp" (Expiration Time) claim is present, the two expiry times should match. + It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2023-07-03T12:27:08.312Z" + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer + required: + - accessToken + - accessTokenExpiresUtc + - accessTokenType + RefreshTokenCredential: + type: object + description: An access token credential with a refresh token. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: | + REQUIRED. An absolute (UTC) timestamp at which the token shall be considered expired. + In the case of an ACCESS_TOKEN_EXPIRED termination reason, implementation should notify the client before the expiration date. + If the access token is a JWT and registered "exp" (Expiration Time) claim is present, the two expiry times should match. + It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2023-07-03T12:27:08.312Z" + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer + refreshToken: + description: REQUIRED. An refresh token credential used to acquire access tokens. + type: string + refreshTokenEndpoint: + type: string + format: uri + description: REQUIRED. A URL at which the refresh token can be traded for an access token. + required: + - accessToken + - accessTokenExpiresUtc + - accessTokenType + - refreshToken + - refreshTokenEndpoint + + responses: + Generic400: + description: Bad Request + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 400 + code: + enum: + - INVALID_ARGUMENT + - OUT_OF_RANGE + examples: + GENERIC_400_INVALID_ARGUMENT: + description: Invalid Argument. Generic Syntax Exception + value: + status: 400 + code: INVALID_ARGUMENT + message: Client specified an invalid argument, request body or query param. + GENERIC_400_OUT_OF_RANGE: + description: Out of Range. Specific Syntax Exception used when a given field has a pre-defined range or a invalid filter criteria combination is requested + value: + status: 400 + code: OUT_OF_RANGE + message: Client specified an invalid range. + Generic401: + description: Unauthorized + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 401 + code: + enum: + - UNAUTHENTICATED + examples: + GENERIC_401_UNAUTHENTICATED: + description: Request cannot be authenticated and a new authentication is required + value: + status: 401 + code: UNAUTHENTICATED + message: Request not authenticated due to missing, invalid, or expired credentials. A new authentication is required. + + Generic403: + description: Forbidden + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 403 + code: + enum: + - PERMISSION_DENIED + examples: + GENERIC_403_PERMISSION_DENIED: + description: Permission denied. OAuth2 token access does not have the required scope or when the user fails operational security + value: + status: 403 + code: PERMISSION_DENIED + message: Client does not have sufficient permissions to perform this action. + Generic404: + description: Not found + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 404 + code: + enum: + - NOT_FOUND + - IDENTIFIER_NOT_FOUND + examples: + GENERIC_404_NOT_FOUND: + description: Specified slice resource is not found based on the sessionId + value: + status: 404 + code: NOT_FOUND + message: The specified resource is not found. + GENERIC_404_IDENTIFIER_NOT_FOUND: + description: Some identifier cannot be matched to a device + value: + status: 404 + code: IDENTIFIER_NOT_FOUND + message: Device identifier not found. + Generic410: + description: Gone + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 410 + code: + enum: + - GONE + examples: + GENERIC_410_GONE: + description: Use in notifications flow to allow API Consumer to indicate that its callback is no longer available + value: + status: 410 + code: GONE + message: Access to the target resource is no longer available. + NetworkSliceBooking422: + description: Unprocessable Content + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 422 + code: + enum: + - NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE + examples: + NETWORK_SLICE_BOOKING_422_RESOURCES_NOT_APPLICABLE: + description: Request cannot be processed due to business logic validation failure, e.g. service area is not supported or resources are insufficient + value: + status: 422 + code: NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE + message: The request resources are not applicable for session creation. + Generic422: + description: Unprocessable Content + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 422 + code: + enum: + - SERVICE_NOT_APPLICABLE + - MISSING_IDENTIFIER + - UNSUPPORTED_IDENTIFIER + - UNNECESSARY_IDENTIFIER + examples: + GENERIC_422_SERVICE_NOT_APPLICABLE: + description: Service not applicable for the provided identifier + value: + status: 422 + code: SERVICE_NOT_APPLICABLE + message: The service is not available for the provided identifier. + GENERIC_422_MISSING_IDENTIFIER: + description: An identifier is not included in the request and the device or phone number identification cannot be derived from the 3-legged access token + value: + status: 422 + code: MISSING_IDENTIFIER + message: The device cannot be identified. + GENERIC_422_UNSUPPORTED_IDENTIFIER: + description: None of the provided identifiers is supported by the implementation + value: + status: 422 + code: UNSUPPORTED_IDENTIFIER + message: The identifier provided is not supported. + GENERIC_422_UNNECESSARY_IDENTIFIER: + description: An explicit identifier is provided when a device or phone number has already been identified from the access token + value: + status: 422 + code: UNNECESSARY_IDENTIFIER + message: The device is already identified by the access token. + Generic429: + description: Quota Exceed or Too Many Requests + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 429 + code: + enum: + - QUOTA_EXCEEDED + - TOO_MANY_REQUESTS + examples: + GENERIC_429_QUOTA_EXCEEDED: + description: Request is rejected due to exceeding a business quota limit + value: + status: 429 + code: QUOTA_EXCEEDED + message: Out of resource quota. + GENERIC_429_TOO_MANY_REQUESTS: + description: Access to the API has been temporarily blocked due to rate or spike arrest limits being reached + value: + status: 429 + code: TOO_MANY_REQUESTS + message: Rate limit reached. + + examples: + ASSIGNMENT_COMPLETED_EVENT: + value: + id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" + source: "https://notificationSendServer12.example.com" + specversion: "1.0" + type: "org.camaraproject.network-slice-booking.v1.assignment-completed" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + resultList: + - phoneNumber: "+123456789" + result: "success" + message: "assigned successfully" + - networkAccessIdentifier: "123456789@example.com" + result: "success" + message: "assigned successfully" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + result: "success" + message: "assigned successfully" + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + result: "success" + message: "assigned successfully" + status: "SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED" + ASSIGN_DEVICES_INPUT_ALL: + summary: Assign devices - All Identifiers + description: Example of request to assign devices to a network slice using all supported identifiers + value: + deviceList: + - phoneNumber: "+123456789" + - networkAccessIdentifier: "123456789@example.com" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + sink: + "https://endpoint.example.com/sink" + sinkCredential: + credentialType: ACCESSTOKEN + accessToken: "" + accessTokenExpiresUtc: "2025-12-31T23:59:59Z" + accessTokenType: bearer + ASSIGN_DEVICES_INPUT_NUMBER: + summary: Assign devices - Phone Number Identifier + description: Example of request to assign devices to a network slice using phone number identifier + value: + deviceList: + - phoneNumber: "+123456789" + - PhoneNumber: "+987654321" + sink: + "https://endpoint.example.com/sink" + sinkCredential: + credentialType: ACCESSTOKEN + accessToken: "" + accessTokenExpiresUtc: "2025-12-31T23:59:59Z" + accessTokenType: bearer + ASSIGN_DEVICES_SUCCESSFUL: + summary: Assignment Successful + description: Example of successful response for assigning devices to a network slice request + value: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + resultList: + - phoneNumber: "+123456789" + result: "success" + message: "assigned successfully" + - networkAccessIdentifier: "123456789@example.com" + result: "success" + message: "assigned successfully" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + result: "success" + message: "assigned successfully" + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + result: "success" + message: "assigned successfully" + status: "SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED" + ASSIGN_DEVICES_PARTIAL_SUCCESS: + summary: Assignment Partial Successful + description: Example of partial successful response for assigning devices to a network slice request + value: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + resultList: + - phoneNumber: "+123456789" + result: "success" + message: "assigned successfully" + - networkAccessIdentifier: "123456789@example.com" + result: "failure" + message: "device not found" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + result: "failure" + message: "device already assigned" + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + result: "success" + message: "assigned successfully" + status: "PARTIAL_SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED_WITH_FAILURES" + ASSIGN_DEVICES_FAILURE: + summary: Assignment Failure for Session Not Found + description: Example of failed response for assigning devices to a network slice request + value: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + status: "FAILURE" + statusInfo: "SESSION_NOT_FOUND" + RELEASE_DEVICES_INPUT_ALL: + summary: Release devices - All Identifiers + description: Example of request to release devices from a network slice using all supported identifiers + value: + deviceList: + - phoneNumber: "+123456789" + - networkAccessIdentifier: "123456789@example.com" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + RELEASE_DEVICES_INPUT_NUMBER: + summary: Release devices - Phone Number Identifier + description: Example of request to assign devices to a network slice using phone number identifier + value: + deviceList: + - phoneNumber: "+123456789" + - PhoneNumber: "+987654321" + sink: + "https://endpoint.example.com/sink" + sinkCredential: + credentialType: ACCESSTOKEN + accessToken: "" + accessTokenExpiresUtc: "2025-12-31T23:59:59Z" + accessTokenType: bearer + RELEASE_DEVICES_SUCCESSFUL: + summary: Release Successful + description: Example of successful response for releasing devices from a network slice request + value: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + resultList: + - phoneNumber: "+123456789" + result: "success" + message: "released successfully" + - networkAccessIdentifier: "123456789@example.com" + result: "success" + message: "released successfully" + - ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + result: "success" + message: "released successfully" + - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + result: "success" + message: "released successfully" + status: "SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED" + GET_DEVICES_SUCCESSFUL: + summary: Get Devices Successful + description: Example of successful response for getting devices assigned to a network slice request + value: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + deviceList: + - phoneNumber: "+123456789" + - networkAccessIdentifier: "123456789@example.com" + sliceInfo: + serviceTime: + startDate: "2024-06-01T12:00:00Z" + endDate: "2024-06-02T12:00:00Z" + serviceArea: + areaType: CIRCLE + center: + latitude: 45.754114 + longitude: 4.860374 + radius: 800 + sliceQosProfile: + maxNumOfDevices: 5 + downStreamRatePerDevice: + value: 10 + unit: bps + upStreamRatePerDevice: + value: 10 + unit: bps + downStreamDelayBudget: + value: 12 + unit: Milliseconds + upStreamDelayBudget: + value: 12 + unit: Milliseconds + RETRIEVE_INPUT_PHONENUMBER: + summary: Retrieve Slice Info - Phone Number Identifier + description: Example of request to retrieve network slice info using phone number identifier + value: + device: + phoneNumber: "+123456789" + RETRIEVE_SUCCESSFUL: + summary: Retrieve Slice Info Successful + description: Example of successful response for retrieving network slice info request + value: + sliceList: + - serviceTime: + startDate: "2024-06-01T12:00:00Z" + endDate: "2024-06-02T12:00:00Z" + serviceArea: + areaType: CIRCLE + center: + latitude: 45.754114 + longitude: 4.860374 + radius: 800 + sliceQosProfile: + maxNumOfDevices: 5 + downStreamRatePerDevice: + value: 10 + unit: bps + upStreamRatePerDevice: + value: 10 + unit: bps + downStreamDelayBudget: + value: 12 + unit: Milliseconds + upStreamDelayBudget: + value: 12 + unit: Milliseconds + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + \ No newline at end of file From 93c39546b99832a652c1b23b0bf86ba549a3d8b5 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Thu, 23 Oct 2025 17:21:02 +0800 Subject: [PATCH 03/13] Add cloud-event notification --- .../network-slice-booking.yaml | 327 +++++++++++++++++- 1 file changed, 326 insertions(+), 1 deletion(-) diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index 083e534..525d076 100644 --- a/code/API_definitions/network-slice-booking.yaml +++ b/code/API_definitions/network-slice-booking.yaml @@ -88,7 +88,45 @@ paths: LOCATION_POLYGON: $ref: "#/components/examples/RETRIEVAL_POLYGON" required: true - + callbacks: + networkSliceBookingSinkCallback: + "{request.body#/sink}": + post: + tags: + - Network Slice Booking Callback + summary: Network slice booking callback + description: Callback for network slice booking events + operationId: postNetworkSliceBookingNotification + requestBody: + description: Network slice booking event notification + content: + application/cloudevents+json: + schema: + $ref: "#/components/schemas/CloudEvent" + examples: + SESSION_CREATED_EVENT_CIRCLE: + $ref: "#/components/examples/SESSION_CREATED_EVENT_CIRCLE" + SESSION_CREATED_EVENT_POLYGON: + $ref: "#/components/examples/SESSION_CREATED_EVENT_POLYGON" + responses: + "204": + description: Successful notification + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + "400": + $ref: "#/components/responses/Generic400" + "401": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "410": + $ref: "#/components/responses/Generic410" + "429": + $ref: "#/components/responses/Generic429" + security: + - {} + - notificationsBearerAuth: [] responses: "201": description: Session created successfully @@ -268,6 +306,15 @@ components: It includes parameters such as maximum number of devices, downlink and uplink throughput per device, and latency requirements. allOf: - $ref: "#/components/schemas/SliceQosProfile" + sink: + type: string + format: uri + description: The URL where the API response will be asynchronously delivered, using the HTTP protocol. + example: "https://endpoint.example.com/sink" + sinkCredential: + description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + allOf: + - $ref: "#/components/schemas/SinkCredential" required: - serviceTime - serviceArea @@ -490,6 +537,188 @@ components: - status - code - message + + CloudEvent: + description: The notification callback + required: + - id + - source + - specversion + - type + - time + properties: + id: + type: string + description: identifier of this event, that must be unique in the source context. + minLength: 1 + source: + $ref: '#/components/schemas/Source' + type: + type: string + description: The type of the event + enum: + - "org.camaraproject.network-slice-booking.v1.session-created" + minLength: 25 + specversion: + type: string + description: Version of the specification to which this event conforms (must be 1.0 if it conforms to cloudevents 1.0.2 version) + enum: + - "1.0" + datacontenttype: + type: string + description: 'media-type that describes the event payload encoding, must be "application/json" for CAMARA APIs' + enum: + - application/json + data: + type: object + description: Event details payload described in each CAMARA API and referenced by its type + time: + $ref: "#/components/schemas/DateTime" + discriminator: + propertyName: type + mapping: + org.camaraproject.network-slice-booking.v1.session-created: "#/components/schemas/SessionCreatedEventData" + + SessionCreatedEventData: + description: Data for session created event + allOf: + - $ref: "#/components/schemas/CloudEvent" + - type: object + properties: + data: + description: Details of the created session + allOf: + - $ref: "#/components/schemas/SessionInfo" + required: + - data + + DateTime: + type: string + format: date-time + description: | + Timestamp of when the occurrence happened. It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + WARN: This optional field in CloudEvents specification is required in CAMARA APIs implementation. + example: '2018-04-05T17:31:00Z' + + Source: + type: string + format: uri-reference + minLength: 1 + description: | + Identifies the context in which an event happened - be a non-empty `URI-reference` like: + - URI with a DNS authority: + * https://github.com/cloudevents + * mailto:cncf-wg-serverless@lists.cncf.io + - Universally-unique URN with a UUID: + * urn:uuid:6e8bc430-9c3a-11d9-9669-0800200c9a66 + - Application-specific identifier: + * /cloudevents/spec/pull/123 + * 1-555-123-4567 + example: "https://notificationSendServer12.example.com" + + SinkCredential: + description: A sink credential provides authentication or authorization information necessary to enable delivery of events to a target. + type: object + properties: + credentialType: + type: string + enum: + - PLAIN + - ACCESSTOKEN + - REFRESHTOKEN + description: | + The type of the credential. + Note: Type of the credential - MUST be set to ACCESSTOKEN for now + discriminator: + propertyName: credentialType + mapping: + PLAIN: "#/components/schemas/PlainCredential" + ACCESSTOKEN: "#/components/schemas/AccessTokenCredential" + REFRESHTOKEN: "#/components/schemas/RefreshTokenCredential" + required: + - credentialType + PlainCredential: + type: object + description: A plain credential as a combination of an identifier and a secret. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + required: + - identifier + - secret + properties: + identifier: + description: The identifier might be an account or username. + type: string + secret: + description: The secret might be a password or passphrase. + type: string + AccessTokenCredential: + type: object + description: An access token credential. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: | + REQUIRED. An absolute (UTC) timestamp at which the token shall be considered expired. + In the case of an ACCESS_TOKEN_EXPIRED termination reason, implementation should notify the client before the expiration date. + If the access token is a JWT and registered "exp" (Expiration Time) claim is present, the two expiry times should match. + It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2023-07-03T12:27:08.312Z" + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer + required: + - accessToken + - accessTokenExpiresUtc + - accessTokenType + RefreshTokenCredential: + type: object + description: An access token credential with a refresh token. + allOf: + - $ref: "#/components/schemas/SinkCredential" + - type: object + properties: + accessToken: + description: REQUIRED. An access token is a previously acquired token granting access to the target resource. + type: string + accessTokenExpiresUtc: + type: string + format: date-time + description: | + REQUIRED. An absolute (UTC) timestamp at which the token shall be considered expired. + In the case of an ACCESS_TOKEN_EXPIRED termination reason, implementation should notify the client before the expiration date. + If the access token is a JWT and registered "exp" (Expiration Time) claim is present, the two expiry times should match. + It must follow [RFC 3339](https://datatracker.ietf.org/doc/html/rfc3339#section-5.6) and must have time zone. + example: "2023-07-03T12:27:08.312Z" + accessTokenType: + description: REQUIRED. Type of the access token (See [OAuth 2.0](https://tools.ietf.org/html/rfc6749#section-7.1)). + type: string + enum: + - bearer + refreshToken: + description: REQUIRED. An refresh token credential used to acquire access tokens. + type: string + refreshTokenEndpoint: + type: string + format: uri + description: REQUIRED. A URL at which the refresh token can be traded for an access token. + required: + - accessToken + - accessTokenExpiresUtc + - accessTokenType + - refreshToken + - refreshTokenEndpoint + responses: Generic400: description: Bad Request @@ -599,6 +828,31 @@ components: status: 404 code: NOT_FOUND message: The specified resource is not found. + Generic410: + description: Gone + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/ErrorInfo" + - type: object + properties: + status: + enum: + - 410 + code: + enum: + - GONE + examples: + GENERIC_410_GONE: + description: Use in notifications flow to allow API Consumer to indicate that its callback is no longer available + value: + status: 410 + code: GONE + message: Access to the target resource is no longer available. NetworkSliceBooking422: description: Unprocessable Content headers: @@ -770,3 +1024,74 @@ components: value: 12 unit: Milliseconds sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + SESSION_CREATED_EVENT_CIRCLE: + value: + id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" + source: "https://notificationSendServer12.example.com" + specversion: "1.0" + type: "org.camaraproject.network-slice-booking.v1.session-created" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + serviceTime: + startDate: "2024-06-01T12:00:00Z" + endDate: "2024-06-02T12:00:00Z" + serviceArea: + areaType: CIRCLE + center: + latitude: 45.754114 + longitude: 4.860374 + radius: 800 + sliceQosProfile: + maxNumOfDevices: 5 + downStreamRatePerDevice: + value: 10 + unit: bps + upStreamRatePerDevice: + value: 10 + unit: bps + downStreamDelayBudget: + value: 12 + unit: Milliseconds + upStreamDelayBudget: + value: 12 + unit: Milliseconds + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + SESSION_CREATED_EVENT_POLYGON: + value: + id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" + source: "https://notificationSendServer12.example.com" + specversion: "1.0" + type: "org.camaraproject.network-slice-booking.v1.session-created" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + serviceTime: + startDate: "2024-06-01T12:00:00Z" + endDate: "2024-06-02T12:00:00Z" + serviceArea: + areaType: POLYGON + boundary: + - latitude: 45.754114 + longitude: 4.860374 + - latitude: 45.753845 + longitude: 4.863185 + - latitude: 45.753916 + longitude: 4.866531 + - latitude: 45.754116 + longitude: 4.876353 + sliceQosProfile: + maxNumOfDevices: 5 + downStreamRatePerDevice: + value: 10 + unit: bps + upStreamRatePerDevice: + value: 10 + unit: bps + downStreamDelayBudget: + value: 12 + unit: Milliseconds + upStreamDelayBudget: + value: 12 + unit: Milliseconds + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" From 44e00576c4d80e706805ed5d118ec98816ab3aa4 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Thu, 6 Nov 2025 17:10:36 +0800 Subject: [PATCH 04/13] modify as the v2 --- .../network-slice-assignment.yaml | 341 ++++-------------- 1 file changed, 80 insertions(+), 261 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index 610850a..7d86f90 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -2,25 +2,19 @@ openapi: 3.0.3 info: title: Network Slice Assignment description: | - This API enables the assignment and release of devices to/from an existing network slice session, as well as retrieving information about devices assigned to a session or sessions assigned to a device. + This API enables the assignment and release of devices to an existing network slice session, as well as retrieving information about devices assigned to a session or sessions assigned to a device. + + This API works with the Network Slice Booking API, which is responsible for creating and managing network slice sessions. The Network Slice Assignment API allows API consumers to manage user subscription to the network slices. # Functionality The Network Slice Assignment API provides the following functionalities: - - **Assign Devices**: Allows the API consumer to assign multiple devices to an existing network slice session, ensuring that the number of devices does not exceed the maximum defined in the slice QoS profile. - - **Release Devices**: Enables the API consumer to release multiple devices from an existing network slice session. + - **Assign Devices**: Allows the API consumer to assign devices to an existing network slice session, ensuring that the number of devices does not exceed the maximum defined in the slice QoS profile. + - **Release Devices**: Enables the API consumer to release devices from an existing network slice session. - **Get Assigned Devices**: Retrieves information about devices currently assigned to a specific network slice session. - **Retrieve Sessions by Device**: Retrieves the list of network slice sessions to which a specific device is assigned. # Terms and Definitions - * **Device**: End-user equipment able to connect to a mobile network. Examples of devices include smartphones or IoT sensors/actuators. - * **Identifier for Device**: The developer can choose to provide one or more of the following device identifiers: - - `ipv4Address` - - `ipv6Address` - - `phoneNumber` - - `networkAccessIdentifier` - NOTE1: the network operator might support only a subset of these options. The API invoker can provide multiple identifiers to be compatible across different network operators. In this case the identifiers MUST belong to the same device. - NOTE2: NetworkAccessIdentifier is defined for future use and will not be currently supported with v0.1 of the API. * **Notification Sink and Token**: API consumers can provide a notification sink URL and an optional sink credential when assigning devices to a session. The notification sink is the URL where the API response will be asynchronously delivered, using the HTTP protocol. The sink credential provides authentication or authorization information necessary to enable delivery of events to the target. @@ -69,11 +63,11 @@ paths: - Network Slice Assignment summary: Assign devices to a network slice session description: | - Assign a list of devices to an existing network slice session. - - NOTES: - - The API consumer can assign multiple devices to an existing session. - - The API consumer must ensure that the number of devices assigned does not exceed the maximum number of devices defined in the slice QoS profile of the session. + Assign a device identified by its phone number to an existing network slice session. The number of devices assigned to the session must not exceed the maximum number defined in the slice QoS profile. + - If the assignment operation is successful, the response will indicate the status as `SUCCESS`. + - If the number of devices exceeds the maximum allowed for the session, the response will indicate the status as `FAILURE` with statusInfo as `MAX_DEVICES_EXCEEDED`. + - Id the device is already assigned to the session, the response will indicate the status as `FAILURE` with statusInfo as `DEVICE_ALREADY_ASSIGNED`. + - If the assignment operation is still in progress, the response will indicate the status as `PENDING`. operationId: assignDevices security: - openId: @@ -93,9 +87,7 @@ paths: schema: $ref: "#/components/schemas/DeviceInput" examples: - ASSIGN_DEVICES_INPUT_ALL: - $ref: "#/components/examples/ASSIGN_DEVICES_INPUT_ALL" - ASSIGN_DEVICES_INPUT_NUMBER: + ASSIGN_DEVICES_INPUT: $ref: "#/components/examples/ASSIGN_DEVICES_INPUT_NUMBER" required: true callbacks: @@ -115,6 +107,8 @@ paths: examples: ASSIGNMENT_COMPLETED_EVENT: $ref: "#/components/examples/ASSIGNMENT_COMPLETED_EVENT" + ASSIGNMENT_DEVICE_EXCEED_EVENT: + $ref: "#/components/examples/ASSIGNMENT_DEVICE_EXCEED_EVENT" required: true responses: "204": @@ -137,7 +131,7 @@ paths: - notificationsBearerAuth: [] responses: "201": - description: At least one device assigned to the session. + description: The result of the device assignment operation headers: x-correlator: $ref: "#/components/headers/x-correlator" @@ -148,10 +142,10 @@ paths: examples: ASSIGN_DEVICES_SUCCESSFUL: $ref: "#/components/examples/ASSIGN_DEVICES_SUCCESSFUL" - ASSIGN_DEVICES_PARTIAL_SUCCESS: - $ref: "#/components/examples/ASSIGN_DEVICES_PARTIAL_SUCCESS" - ASSIGN_DEVICES_FAILURE: - $ref: "#/components/examples/ASSIGN_DEVICES_FAILURE" + ASSIGN_DEVICES_FAILURE_EXCEEDED: + $ref: "#/components/examples/ASSIGN_DEVICES_FAILURE_EXCEEDED" + ASSIGN_DEVICES_ALREADY_ASSIGNED: + $ref: "#/components/examples/ASSIGN_DEVICES_ALREADY_ASSIGNED" "400": $ref: "#/components/responses/Generic400" "401": @@ -171,10 +165,9 @@ paths: - Network Slice Assignment summary: Release devices from a network slice session description: | - Release a list of devices from an existing network slice session. - - NOTES: - - The API consumer can release multiple devices from an existing session. + Unbind devices to an existing network slice session. + - If a device is not assigned to the session, it will return `FAILURE` status with statusInfo as `DEVICE_NOT_ASSIGNED` for that device in the response. + - If a device is successfully released from the session, it will return `SUCCESS` status. operationId: releaseDevices security: - openId: @@ -192,16 +185,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/DeviceInput" + $ref: "#/components/schemas/ReleaseDeviceInput" examples: - RELEASE_DEVICES_INPUT_ALL: - $ref: "#/components/examples/RELEASE_DEVICES_INPUT_ALL" RELEASE_DEVICES_INPUT_NUMBER: $ref: "#/components/examples/RELEASE_DEVICES_INPUT_NUMBER" required: true responses: "200": - description: At least one device released from the session. + description: The result of the device release operation headers: x-correlator: $ref: "#/components/headers/x-correlator" @@ -286,7 +277,7 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/Device" + $ref: "#/components/schemas/PhoneNumber" examples: RETRIEVE_INPUT_PHONENUMBER: $ref: "#/components/examples/RETRIEVE_INPUT_PHONENUMBER" @@ -343,11 +334,11 @@ components: type: string format: uuid DeviceInput: - description: Request to add or release devices to a session + description: Request to add devices to a session type: object properties: - deviceList: - $ref: "#/components/schemas/Devices" + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" sink: type: string format: uri @@ -358,158 +349,61 @@ components: allOf: - $ref: "#/components/schemas/SinkCredential" required: - - deviceList - Devices: - description: List of device identifiers - type: array - items: - $ref: "#/components/schemas/Device" - minItems: 1 - Device: - description: | - End-user equipment able to connect to a mobile network. Examples of devices include smartphones or IoT sensors/actuators. - The developer can choose to provide the below specified device identifiers: - * `ipv4Address` - * `ipv6Address` - * `phoneNumber` - * `networkAccessIdentifier` - NOTE1: the network operator might support only a subset of these options. The API invoker can provide multiple identifiers to be compatible across different network operators. In this case the identifiers MUST belong to the same device. - NOTE2: as for this Commonalities release, we are enforcing that the networkAccessIdentifier is only part of the schema for future-proofing, and CAMARA does not currently allow its use. After the CAMARA meta-release work is concluded and the relevant issues are resolved, its use will need to be explicitly documented in the guidelines. - type: object - properties: - phoneNumber: - $ref: "#/components/schemas/PhoneNumber" - networkAccessIdentifier: - $ref: "#/components/schemas/NetworkAccessIdentifier" - ipv4Address: - $ref: "#/components/schemas/DeviceIpv4Addr" - ipv6Address: - $ref: "#/components/schemas/DeviceIpv6Address" - minProperties: 1 + - phoneNumber PhoneNumber: description: A public identifier addressing a telephone subscription. In mobile networks it corresponds to the MSISDN (Mobile Station International Subscriber Directory Number). In order to be globally unique it has to be formatted in international format, according to E.164 standard, prefixed with '+'. type: string pattern: '^\+[1-9][0-9]{4,14}$' example: "+123456789" - - NetworkAccessIdentifier: - description: A public identifier addressing a subscription in a mobile network. In 3GPP terminology, it corresponds to the GPSI formatted with the External Identifier ({Local Identifier}@{Domain Identifier}). Unlike the telephone number, the network access identifier is not subjected to portability ruling in force, and is individually managed by each operator. - type: string - example: "123456789@example.com" - - DeviceIpv4Addr: + ReleaseDeviceInput: + description: Request to release devices from a session type: object - description: | - The device should be identified by either the public (observed) IP address and port as seen by the application server, or the private (local) and any public (observed) IP addresses in use by the device (this information can be obtained by various means, for example from some DNS servers). - - If the allocated and observed IP addresses are the same (i.e. NAT is not in use) then the same address should be specified for both publicAddress and privateAddress. - - If NAT64 is in use, the device should be identified by its publicAddress and publicPort, or separately by its allocated IPv6 address (field ipv6Address of the Device object) - - In all cases, publicAddress must be specified, along with at least one of either privateAddress or publicPort, dependent upon which is known. In general, mobile devices cannot be identified by their public IPv4 address alone. properties: - publicAddress: - $ref: "#/components/schemas/SingleIpv4Addr" - privateAddress: - $ref: "#/components/schemas/SingleIpv4Addr" - publicPort: - $ref: "#/components/schemas/Port" - anyOf: - - required: [publicAddress, privateAddress] - - required: [publicAddress, publicPort] - example: - publicAddress: "84.125.93.10" - publicPort: 59765 - SingleIpv4Addr: - description: A single IPv4 address with no subnet mask - type: string - format: ipv4 - example: "84.125.93.10" - - Port: - description: TCP or UDP port number - type: integer - minimum: 0 - maximum: 65535 - - DeviceIpv6Address: - description: | - The device should be identified by the observed IPv6 address, or by any single IPv6 address from within the subnet allocated to the device (e.g. adding ::0 to the /64 prefix). - type: string - format: ipv6 - example: 2001:db8:85a3:8d3:1319:8a2e:370:7344 - + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" + required: + - phoneNumber DeviceOutput: description: Response after assigning devices to a session type: object properties: sessionId: $ref: "#/components/schemas/SessionId" - resultList: - $ref: "#/components/schemas/ResultList" + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" status: $ref: "#/components/schemas/AssignmentStatus" statusInfo: $ref: "#/components/schemas/AssignmentStatusInfo" required: - sessionId + - phoneNumber - status - statusInfo AssignmentStatus: description: | Status of the device assignment operation * `SUCCESS` - All devices were successfully assigned to the session - * `PARTIALLY_SUCCESS` - Some devices were successfully assigned to the session, while others failed * `FAILURE` - No devices were assigned to the session * `PENDING` - The assignment operation is still in progress type: string enum: - SUCCESS - - PARTIALLY_SUCCESS - FAILURE - PENDING AssignmentStatusInfo: description: | Additional information about the assignment status * `ASSIGNMENT_COMPLETED` - The assignment operation has been completed - * `ASSIGNMENT_COMPLETED_WITH_FAILURES` - The assignment operation has been completed with some failures * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the session - * `INVALID_DEVICE_IDENTIFIER` - One or more device identifiers are invalid - * `DEVICE_NOT_FOUND` - One or more devices were not found - * `DEVICE_ALREADY_ASSIGNED` - One or more devices are already assigned to the session - * `SESSION_NOT_FOUND` - The specified session ID does not exist + * `DEVICE_ALREADY_ASSIGNED` - Devices are already assigned to the session + * `DEVICE_NOT_ASSIGNED` - Devices are not assigned to the session type: string enum: - ASSIGNMENT_COMPLETED - - ASSIGNMENT_COMPLETED_WITH_FAILURES - MAX_DEVICES_EXCEEDED - - INVALID_DEVICE_IDENTIFIER - - DEVICE_NOT_FOUND - DEVICE_ALREADY_ASSIGNED - - SESSION_NOT_FOUND - ResultList: - description: List of devices that failed to be assigned to the session - type: array - items: - $ref: "#/components/schemas/AssignmentResult" - AssignmentResult: - description: Result of a device assignment attempt - type: object - properties: - device: - $ref: "#/components/schemas/Device" - result: - type: string - description: result of the assignment attempt for the device - enum: - - SUCCESS - - FAILURE - message: - type: string - description: Detailed reason for failure, if applicable - required: - - device - - result + - DEVICE_NOT_ASSIGNED RetrievedSessionsOutput: description: Response containing sessions assigned to a device type: object @@ -525,7 +419,10 @@ components: type: object properties: deviceList: - $ref: "#/components/schemas/Devices" + type: array + items: + $ref: "#/components/schemas/PhoneNumber" + minItems: 0 sliceInfo: $ref: "#/components/schemas/SessionInfo" required: @@ -1223,6 +1120,8 @@ components: examples: ASSIGNMENT_COMPLETED_EVENT: + summary: Assignment Completed Event + description: Example of notification event sent when device assignment is completed value: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" @@ -1232,48 +1131,30 @@ components: time: "2024-06-01T12:00:00Z" data: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - resultList: - - phoneNumber: "+123456789" - result: "success" - message: "assigned successfully" - - networkAccessIdentifier: "123456789@example.com" - result: "success" - message: "assigned successfully" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - result: "success" - message: "assigned successfully" - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" - result: "success" - message: "assigned successfully" + phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "ASSIGNMENT_COMPLETED" - ASSIGN_DEVICES_INPUT_ALL: - summary: Assign devices - All Identifiers - description: Example of request to assign devices to a network slice using all supported identifiers + ASSIGNMENT_DEVICE_EXCEED_EVENT: + summary: Assignment Device Exceed Event + description: Example of notification event sent when device assignment fails due to maximum devices exceeded value: - deviceList: - - phoneNumber: "+123456789" - - networkAccessIdentifier: "123456789@example.com" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" - sink: - "https://endpoint.example.com/sink" - sinkCredential: - credentialType: ACCESSTOKEN - accessToken: "" - accessTokenExpiresUtc: "2025-12-31T23:59:59Z" - accessTokenType: bearer + id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" + source: "https://notificationSendServer12.example.com" + specversion: "1.0" + type: "org.camaraproject.network-slice-booking.v1.assignment-device-exceed" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "MAX_DEVICES_EXCEEDED" ASSIGN_DEVICES_INPUT_NUMBER: summary: Assign devices - Phone Number Identifier description: Example of request to assign devices to a network slice using phone number identifier value: - deviceList: + device: - phoneNumber: "+123456789" - - PhoneNumber: "+987654321" sink: "https://endpoint.example.com/sink" sinkCredential: @@ -1286,97 +1167,38 @@ components: description: Example of successful response for assigning devices to a network slice request value: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - resultList: - - phoneNumber: "+123456789" - result: "success" - message: "assigned successfully" - - networkAccessIdentifier: "123456789@example.com" - result: "success" - message: "assigned successfully" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - result: "success" - message: "assigned successfully" - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" - result: "success" - message: "assigned successfully" + phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "ASSIGNMENT_COMPLETED" - ASSIGN_DEVICES_PARTIAL_SUCCESS: - summary: Assignment Partial Successful - description: Example of partial successful response for assigning devices to a network slice request + ASSIGN_DEVICES_FAILURE_EXCEEDED: + summary: Assignment Failure for DeviceNum Exceeded + description: Example of failure response for assigning devices to a network slice request due to maximum devices exceeded value: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - resultList: - - phoneNumber: "+123456789" - result: "success" - message: "assigned successfully" - - networkAccessIdentifier: "123456789@example.com" - result: "failure" - message: "device not found" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - result: "failure" - message: "device already assigned" - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" - result: "success" - message: "assigned successfully" - status: "PARTIAL_SUCCESS" - statusInfo: "ASSIGNMENT_COMPLETED_WITH_FAILURES" - ASSIGN_DEVICES_FAILURE: - summary: Assignment Failure for Session Not Found - description: Example of failed response for assigning devices to a network slice request + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "MAX_DEVICES_EXCEEDED" + ASSIGN_DEVICES_ALREADY_ASSIGNED: + summary: Assignment Failure for Device Already Assigned + description: Example of failure response for assigning devices to a network slice request due to device already assigned value: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + phoneNumber: "+123456789" status: "FAILURE" - statusInfo: "SESSION_NOT_FOUND" - RELEASE_DEVICES_INPUT_ALL: - summary: Release devices - All Identifiers - description: Example of request to release devices from a network slice using all supported identifiers - value: - deviceList: - - phoneNumber: "+123456789" - - networkAccessIdentifier: "123456789@example.com" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + statusInfo: "DEVICE_ALREADY_ASSIGNED" + RELEASE_DEVICES_INPUT_NUMBER: summary: Release devices - Phone Number Identifier description: Example of request to assign devices to a network slice using phone number identifier value: - deviceList: - - phoneNumber: "+123456789" - - PhoneNumber: "+987654321" - sink: - "https://endpoint.example.com/sink" - sinkCredential: - credentialType: ACCESSTOKEN - accessToken: "" - accessTokenExpiresUtc: "2025-12-31T23:59:59Z" - accessTokenType: bearer + phoneNumber: "+123456789" + RELEASE_DEVICES_SUCCESSFUL: summary: Release Successful description: Example of successful response for releasing devices from a network slice request value: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - resultList: - - phoneNumber: "+123456789" - result: "success" - message: "released successfully" - - networkAccessIdentifier: "123456789@example.com" - result: "success" - message: "released successfully" - - ipv4Address: - publicAddress: "84.125.93.10" - publicPort: 59765 - result: "success" - message: "released successfully" - - ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" - result: "success" - message: "released successfully" + phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "ASSIGNMENT_COMPLETED" GET_DEVICES_SUCCESSFUL: @@ -1384,9 +1206,7 @@ components: description: Example of successful response for getting devices assigned to a network slice request value: sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - deviceList: - - phoneNumber: "+123456789" - - networkAccessIdentifier: "123456789@example.com" + phoneNumber: "+123456789" sliceInfo: serviceTime: startDate: "2024-06-01T12:00:00Z" @@ -1415,8 +1235,7 @@ components: summary: Retrieve Slice Info - Phone Number Identifier description: Example of request to retrieve network slice info using phone number identifier value: - device: - phoneNumber: "+123456789" + phoneNumber: "+123456789" RETRIEVE_SUCCESSFUL: summary: Retrieve Slice Info Successful description: Example of successful response for retrieving network slice info request From 39329a8493c85194acb297ed888e0fe3f29d1541 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Thu, 13 Nov 2025 15:35:16 +0800 Subject: [PATCH 05/13] Modify the term session to slice, make it clearer for specifing creating a new network slcie --- .../network-slice-booking.yaml | 148 +++++++++--------- ...etwork-slice-booking-createSession.feature | 48 +++--- ...etwork-slice-booking-deleteSession.feature | 50 +++--- .../network-slice-booking-getSession.feature | 54 +++---- 4 files changed, 150 insertions(+), 150 deletions(-) diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index 525d076..b4faee6 100644 --- a/code/API_definitions/network-slice-booking.yaml +++ b/code/API_definitions/network-slice-booking.yaml @@ -7,23 +7,23 @@ info: # Introduction - This API allows the API consumer to book the availability of a session (also known as a "network slice"), specifying the service time, service area, and quality of service (QoS) profile. + This API allows the API consumer to book the availability of a network slice, specifying the service time, service area, and quality of service (QoS) profile. It checks whether the requested QoS profile can be guaranteed for the indicated time and area, and, if so, it reserves the network slice accordingly, and monitors that the slice delivers the QoS profile. The latter process is known as Service Level Agreement (SLA) monitoring. - The API consumer can also retrieve information about an existing session or delete a session. + The API consumer can also retrieve information about an existing slice or delete a slice. # API functionality The API provides the following functionality: - - Create a new session (network slice), specifying the service time, service area, and QoS profile. - - Retrieve information about an existing session, including the service time, service area, and QoS profile. - - Delete an existing session. + - Create a new network slice, specifying the service time, service area, and QoS profile. + - Retrieve information about an existing slice, including the service time, service area, and QoS profile. + - Delete an existing slice. # Request Parameters Definition: * **serviceTime**: is defined by a start time and an end time, which indicates the period during which the network slice will be reserved. * **serviceArea**: can be defined as a circle or a polygon, allowing for flexible geographical coverage. * **sliceQosProfile**: includes parameters such as maximum number of devices, downstream and upstream rate per device, and packet delay budget. - * **sessionId**: is a unique identifier for the session, which is returned when a session is created and used to retrieve or delete the session later. + * **sliceId**: is a unique identifier for the network slice, which is returned when a slice is created and used to retrieve or delete the slice later. # Authorization and authentication @@ -56,32 +56,32 @@ servers: default: http://localhost:9100 description: API root, defined by the service provider, e.g. `api.example.com` or `api.example.com/somepath` tags: - - name: Network Slice Booking Sessions - description: Manage Network Slice Booking sessions + - name: Network Slice Booking + description: Manage Network Slice Booking paths: - /sessions: + /slices: post: tags: - - Network Slice Booking Sessions - summary: Creates a new session + - Network Slice Booking + summary: Creates a new network slice description: | - Create a new session (network slice) with the expected service time, service area, and QoS profile. + Create a new network slice with the expected service time, service area, and QoS profile. NOTES: - If expected network slice resources are not available, the API consumer will receive an error response with code `422 - NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE`. - - If session creation is successful, the API consumer will receive a response with code `201 - Created` and a session ID. - operationId: createSession + - If newtwork slice creation is successful, the API consumer will receive a response with code `201 - Created` and a slice ID. + operationId: createSlice security: - openId: - - network-slice-booking:sessions:create + - network-slice-booking:slices:create parameters: - $ref: "#/components/parameters/x-correlator" requestBody: - description: Parameters to create a new session + description: Parameters to create a new network slice content: application/json: schema: - $ref: "#/components/schemas/CreateSession" + $ref: "#/components/schemas/CreateSlice" examples: LOCATION_CIRCLE: $ref: "#/components/examples/RETRIEVAL_CIRCLE" @@ -104,10 +104,10 @@ paths: schema: $ref: "#/components/schemas/CloudEvent" examples: - SESSION_CREATED_EVENT_CIRCLE: - $ref: "#/components/examples/SESSION_CREATED_EVENT_CIRCLE" - SESSION_CREATED_EVENT_POLYGON: - $ref: "#/components/examples/SESSION_CREATED_EVENT_POLYGON" + SLICE_CREATED_EVENT_CIRCLE: + $ref: "#/components/examples/SLICE_CREATED_EVENT_CIRCLE" + SLICE_CREATED_EVENT_POLYGON: + $ref: "#/components/examples/SLICE_CREATED_EVENT_POLYGON" responses: "204": description: Successful notification @@ -129,14 +129,14 @@ paths: - notificationsBearerAuth: [] responses: "201": - description: Session created successfully + description: Slice created successfully headers: x-correlator: $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/SessionInfo" + $ref: "#/components/schemas/SliceInfo" examples: RESPONSE_CIRCLE: $ref: "#/components/examples/RESPONSE_CIRCLE" @@ -153,33 +153,33 @@ paths: "429": $ref: "#/components/responses/Generic429" - /sessions/{sessionId}: + /slices/{sliceId}: delete: tags: - - Network Slice Booking Sessions - summary: Delete a NSB session + - Network Slice Booking + summary: Delete a network slice description: | - Release slice resources related to sessionId. + Release slice resources related to sliceId. NOTES: - - The deletion operation takes effect immediately, e.g. if the session is deleted before the end of the service time, the service will end ahead of the scheduled time. - - If the session is deleted, the API consumer will not be able to retrieve information about the session. - - The deletion operation is idempotent, meaning that if the session is already deleted, the API consumer will receive a response with code `204 - No Content`. - operationId: deleteSession + - The deletion operation takes effect immediately, e.g. if the slice is deleted before the end of the service time, the service will end ahead of the scheduled time. + - If the slice is deleted, the API consumer will not be able to retrieve information about the slice. + - The deletion operation is idempotent, meaning that if the slice is already deleted, the API consumer will receive a response with code `204 - No Content`. + operationId: deleteSlice security: - openId: - - network-slice-booking:sessions:delete + - network-slice-booking:slices:delete parameters: - - name: sessionId + - name: sliceId in: path - description: Session ID that was obtained from the createSession operation + description: Slice ID that was obtained from the createSlice operation required: true schema: - $ref: "#/components/schemas/SessionId" + $ref: "#/components/schemas/SliceId" - $ref: "#/components/parameters/x-correlator" responses: "204": - description: Session deleted + description: Slice deleted headers: x-correlator: $ref: "#/components/headers/x-correlator" @@ -196,36 +196,36 @@ paths: get: tags: - - Network Slice Booking Sessions - summary: Get NSB session information + - Network Slice Booking + summary: Get network slcie booking information description: | - Querying for NSB session resource information details. + Querying for network slcie booking resource information details. NOTES: - - According to sessionId, the API consumer can retrieve information about an existing session, including the service time, service area, and QoS profile. - - If the session is deleted, the API consumer will receive a response with code `404 - Not Found`. - operationId: getSession + - According to sliceId, the API consumer can retrieve information about an existing slice, including the service time, service area, and QoS profile. + - If the slice is deleted, the API consumer will receive a response with code `404 - Not Found`. + operationId: getSlice security: - openId: - - network-slice-booking:sessions:get + - network-slice-booking:slices:get parameters: - - name: sessionId + - name: sliceId in: path - description: Session ID that was obtained from the createSession operation + description: Slice ID that was obtained from the createSlice operation required: true schema: - $ref: "#/components/schemas/SessionId" + $ref: "#/components/schemas/SliceId" - $ref: "#/components/parameters/x-correlator" responses: "200": - description: Contains information about active session + description: Contains information about network slice booking headers: x-correlator: $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/SessionInfo" + $ref: "#/components/schemas/SliceInfo" examples: RESPONSE_CIRCLE: $ref: "#/components/examples/RESPONSE_CIRCLE" @@ -269,23 +269,23 @@ components: type: string pattern: ^[a-zA-Z0-9-_:;.\/<>{}]{0,256}$ example: "b4333c46-49c0-4f62-80d7-f0ef930f1c46" - SessionId: - description: Session ID in UUID format + SliceId: + description: Slice ID in UUID format type: string format: uuid - SessionInfo: - description: Session related information. + SliceInfo: + description: Slice related information. allOf: - - $ref: "#/components/schemas/CreateSession" + - $ref: "#/components/schemas/CreateSlice" - type: object properties: - sessionId: - $ref: "#/components/schemas/SessionId" + sliceId: + $ref: "#/components/schemas/SliceId" required: - - sessionId + - sliceId - CreateSession: - description: Attributes required to create a session + CreateSlice: + description: Attributes required to create a slice type: object properties: serviceTime: @@ -557,7 +557,7 @@ components: type: string description: The type of the event enum: - - "org.camaraproject.network-slice-booking.v1.session-created" + - "org.camaraproject.network-slice-booking.v1.slice-created" minLength: 25 specversion: type: string @@ -577,18 +577,18 @@ components: discriminator: propertyName: type mapping: - org.camaraproject.network-slice-booking.v1.session-created: "#/components/schemas/SessionCreatedEventData" + org.camaraproject.network-slice-booking.v1.slice-created: "#/components/schemas/SliceCreatedEventData" - SessionCreatedEventData: - description: Data for session created event + SliceCreatedEventData: + description: Data for slice created event allOf: - $ref: "#/components/schemas/CloudEvent" - type: object properties: data: - description: Details of the created session + description: Details of the created slice allOf: - - $ref: "#/components/schemas/SessionInfo" + - $ref: "#/components/schemas/SliceInfo" required: - data @@ -823,7 +823,7 @@ components: - NOT_FOUND examples: GENERIC_404_NOT_FOUND: - description: Specified slice resource is not found based on the sessionId + description: Specified slice resource is not found based on the sliceId value: status: 404 code: NOT_FOUND @@ -877,7 +877,7 @@ components: value: status: 422 code: NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE - message: The request resources are not applicable for session creation. + message: The request resources are not applicable for slice creation. Generic429: description: Quota Exceed or Too Many Requests headers: @@ -992,7 +992,7 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" RESPONSE_POLYGON: value: serviceTime: @@ -1023,13 +1023,13 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - SESSION_CREATED_EVENT_CIRCLE: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + SLICE_CREATED_EVENT_CIRCLE: value: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.session-created" + type: "org.camaraproject.network-slice-booking.v1.slice-created" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: @@ -1056,13 +1056,13 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - SESSION_CREATED_EVENT_POLYGON: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + SLICE_CREATED_EVENT_POLYGON: value: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.session-created" + type: "org.camaraproject.network-slice-booking.v1.slice-created" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: @@ -1094,4 +1094,4 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" diff --git a/code/Test_definitions/network-slice-booking-createSession.feature b/code/Test_definitions/network-slice-booking-createSession.feature index 1f61c02..b6ed2b8 100644 --- a/code/Test_definitions/network-slice-booking-createSession.feature +++ b/code/Test_definitions/network-slice-booking-createSession.feature @@ -1,4 +1,4 @@ -Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession +Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSlice # Input to be provided by the implementation to the tester # @@ -16,32 +16,32 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession # # References to OAS spec schemas refer to schemas specified in network-slice-booking.yaml, version 0.1.0 - Background: Common createSession setup + Background: Common createSlice setup Given an environment at "apiRoot" - And the resource "/network-slice-booking/v0.1/sessions" + And the resource "/network-slice-booking/v0.1/slices" And the header "Content-Type" is set to "application/json" And the header "Authorization" is set to a valid access token And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" # Properties not explicitly overwritten in the Scenarios can take any values compliant with the schema - And the request body is set by default to a request body compliant with the schema at "/components/schemas/CreateSession" + And the request body is set by default to a request body compliant with the schema at "/components/schemas/CreateSlice" # Success scenarios - @network_slice_booking_createSession_01_generic_success_scenario + @network_slice_booking_createSlice_01_generic_success_scenario Scenario: Common validations for any success scenario Given starttime, endtime, the request body property "$.serviceArea" is set to the provided service area and the configuration of information of network slicing - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 201 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" - And the response body complies with the OAS schema at "/components/schemas/SessionInfo" - And the response property "$.sessionId" is a character string + And the response body complies with the OAS schema at "/components/schemas/SliceInfo" + And the response property "$.sliceId" is a character string And the configuration information of user's network slice booking - @network_slice_booking_createSession_02_invalid_argument_scenario + @network_slice_booking_createSlice_02_invalid_argument_scenario Scenario: Error response for invalid argument in request body Given the request body property argument is invalid, such as illegal character and format error - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 400 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" @@ -49,10 +49,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession And the response property "$.code" is "INVALID_ARGUMENT" And the response property "$.message" is "Client specified an invalid argument, request body or query param." - @network_slice_booking_createSession_03_out_of_range_scenario + @network_slice_booking_createSlice_03_out_of_range_scenario Scenario: Error responses where the parameters in the request body are out of range Given the request body property argument are out of range, for example maxNumOfDevices is a negative integer - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 400 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" @@ -60,11 +60,11 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession And the response property "$.code" is "OUT_OF_RANGE" And the response property "$.message" is "Client specified an invalid range." - @network_slice_booking_createSession_04_missing_authorization_scenario + @network_slice_booking_createSlice_04_missing_authorization_scenario Scenario: Error response for no header "Authorization" Given the header "Authorization" is not sent And the request body is set to a valid request body - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 401 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -72,10 +72,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession And the response property "$.code" is "UNAUTHENTICATED" And the response property "$.message" contains a user friendly text - @network_slice_booking_createSession_05_missing_access_token_scope_scenario + @network_slice_booking_createSlice_05_missing_access_token_scope_scenario Scenario: Missing access token scope - Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:sessions:create - When the request "createSession" is sent + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:create + When the request "createSlice" is sent Then the response status code is 403 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -83,21 +83,21 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - @network_slice_booking_createSession_07_area_not_support_fail_scenario + @network_slice_booking_createSlice_07_area_not_support_fail_scenario Scenario: Common validations for fail scenario of area not supported Given starttime, endtime, the request body property "$.serviceArea" is set to the service area of not supported and the configuration of information of network slicing - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 422 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" And the response property "$.status" is 422 And the response property "$.code" is "NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE" - And the response property "$.message" is "The request resources are not applicable for session creation." + And the response property "$.message" is "The request resources are not applicable for slice creation." - @network_slice_booking_createSession_08_quota_exceeded_scenario + @network_slice_booking_createSlice_08_quota_exceeded_scenario Scenario: Error response for quota exceeded Given the right request body property argument - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 429 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -105,10 +105,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation createSession And the response property "$.code" is "QUOTA_EXCEEDED" And the response property "$.message" is "Out of resource quota." - @network_slice_booking_createSession_09_too_many_requests_scenario + @network_slice_booking_createSlice_09_too_many_requests_scenario Scenario: Error response for too many requests Given the right request body property argument - When the request "createSession" is sent + When the request "createSlice" is sent Then the response status code is 429 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" diff --git a/code/Test_definitions/network-slice-booking-deleteSession.feature b/code/Test_definitions/network-slice-booking-deleteSession.feature index cc94b01..cfc3f50 100644 --- a/code/Test_definitions/network-slice-booking-deleteSession.feature +++ b/code/Test_definitions/network-slice-booking-deleteSession.feature @@ -1,4 +1,4 @@ -Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession +Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSlice # Input to be provided by the implementation to the tester # @@ -6,32 +6,32 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession # * apiRoot: API root of the server URL # # Testing assets: - # * The sessionId of an existing session. + # * The sliceId of an existing slice. # * References to OAS spec schemas refer to schemas specified in network-slice-booking.yaml, version 0.1.0 - Background: Common deleteSession setup + Background: Common deleteSlice setup Given an environment at "apiRoot" - And the resource "/network-slice-booking/v0.1/sessions/{sessionId}" + And the resource "/network-slice-booking/v0.1/slices/{sliceId}" And the header "Content-Type" is set to "application/json" And the header "Authorization" is set to a valid access token And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" - And the path parameter "sessionId" is set by default to a existing network slice session sessionId + And the path parameter "sliceId" is set by default to a existing network slice sliceId # Success scenarios - @network_slice_booking_deleteSession_01_delete_existing_session_scenario - Scenario: Delete an existing network slice session - Given an existing network slice session created by operation createSession - And the path parameter "sessionId" is set to the value for that network slice session - When the request "deleteSession" is sent + @network_slice_booking_deleteSlice_01_delete_existing_slice_scenario + Scenario: Delete an existing network slice + Given an existing network slice created by operation createSlice + And the path parameter "sliceId" is set to the value for that network slice + When the request "deleteSlice" is sent Then the response status code is 204 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" - @network_slice_booking_deleteSession_02_invalid_session_id_scenario + @network_slice_booking_deleteSlice_02_invalid_slice_id_scenario Scenario: Invalid Argument. Generic Syntax Exception - Given the path parameter "sessionId" has not a UUID format - When the request "deleteSession" is sent + Given the path parameter "sliceId" has not a UUID format + When the request "deleteSlice" is sent Then the response status code is 400 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -39,10 +39,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession And the response property "$.code" is "INVALID_ARGUMENT" And the response property "$.message" is "Client specified an invalid argument, request body or query param." - @network_slice_booking_deleteSession_03_out_of_range_scenario + @network_slice_booking_deleteSlice_03_out_of_range_scenario Scenario: Error responses where the parameters in the request body are out of range Given the request body property argument are out of range - When the request "deleteSession" is sent + When the request "deleteSlice" is sent Then the response status code is 400 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" @@ -50,11 +50,11 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession And the response property "$.code" is "OUT_OF_RANGE" And the response property "$.message" is "Client specified an invalid range." - @network_slice_booking_deleteSession_04_missing_authorization_scenario + @network_slice_booking_deleteSlice_04_missing_authorization_scenario Scenario: Error response for no header "Authorization" Given the header "Authorization" is not sent And the request body is set to a valid request body - When the request "deleteSession" is sent + When the request "deleteSlice" is sent Then the response status code is 401 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -62,10 +62,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession And the response property "$.code" is "UNAUTHENTICATED" And the response property "$.message" contains a user friendly text - @network_slice_booking_deleteSession_05_missing_access_token_scope_scenario + @network_slice_booking_deleteSlice_05_missing_access_token_scope_scenario Scenario: Missing access token scope - Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:sessions:delete - When the request "deleteSession" is sent + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:delete + When the request "deleteSlice" is sent Then the response status code is 403 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -73,10 +73,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - @network_slice_booking_deleteSession_06_resource_not_found_scenario + @network_slice_booking_deleteSlice_06_resource_not_found_scenario Scenario: Error response for not found resouce - Given an correct format and not existing network slice session id - When the request "deleteSession" is sent + Given an correct format and not existing network slice slice id + When the request "deleteSlice" is sent Then the response status code is 404 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -84,10 +84,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation deleteSession And the response property "$.code" is "NOT_FOUND" And the response property "$.message" is "The specified resource is not found." - @network_slice_booking_deleteSession_07_too_many_requests_scenario + @network_slice_booking_deleteSlice_07_too_many_requests_scenario Scenario: Error response for too many requests Given the right request body property argument - When the request "deleteSession" is sent + When the request "deleteSlice" is sent Then the response status code is 429 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" diff --git a/code/Test_definitions/network-slice-booking-getSession.feature b/code/Test_definitions/network-slice-booking-getSession.feature index 4faf176..c068ab6 100644 --- a/code/Test_definitions/network-slice-booking-getSession.feature +++ b/code/Test_definitions/network-slice-booking-getSession.feature @@ -1,4 +1,4 @@ -Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession +Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSlice # Input to be provided by the implementation to the tester # @@ -6,35 +6,35 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession # * apiRoot: API root of the server URL # # Testing assets: - # * The sessionId of an existing session. + # * The sliceId of an existing slice. # * References to OAS spec schemas refer to schemas specified in network-slice-booking.yaml, version 0.1.0 - Background: Common getSession setup + Background: Common getSlice setup Given an environment at "apiRoot" - And the resource "/network-slice-booking/v0.1/sessions/{sessionId}" + And the resource "/network-slice-booking/v0.1/slices/{sliceId}" And the header "Content-Type" is set to "application/json" And the header "Authorization" is set to a valid access token And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" - And the path parameter "sessionId" is set by default to a existing network slice session sessionId + And the path parameter "sliceId" is set by default to a existing network slice sliceId # Success scenarios - @network_slice_booking_getSession_01_get_existing_session_scenario - Scenario: Get an existing network slice session - Given an existing network slice session created by operation createSession - And the path parameter "sessionId" is set to the value for that network slice session - When the request "getSession" is sent + @network_slice_booking_getSlice_01_get_existing_slice_scenario + Scenario: Get an existing network slice + Given an existing network slice created by operation createSlice + And the path parameter "sliceId" is set to the value for that network slice + When the request "getSlice" is sent Then the response status code is 200 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" - And the response body complies with the OAS schema at "/components/schemas/SessionInfo" - And the response property "sessionId" is a character string and the information of The user's session id + And the response body complies with the OAS schema at "/components/schemas/SliceInfo" + And the response property "sliceId" is a character string and the information of The user's slice id And the configuration information of user's network slice booking - @network_slice_booking_getSession_02_invalid_session_id_scenario + @network_slice_booking_getSlice_02_invalid_slice_id_scenario Scenario: Invalid Argument. Generic Syntax Exception - Given the path parameter "sessionId" has not a UUID format - When the request "getSession" is sent + Given the path parameter "sliceId" has not a UUID format + When the request "getSlice" is sent Then the response status code is 400 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -42,10 +42,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession And the response property "$.code" is "INVALID_ARGUMENT" And the response property "$.message" is "Client specified an invalid argument, request body or query param." - @network_slice_booking_getSession_03_out_of_range_scenario + @network_slice_booking_getSlice_03_out_of_range_scenario Scenario: Error responses where the parameters in the request body are out of range Given the request body property argument are out of range - When the request "getSession" is sent + When the request "getSlice" is sent Then the response status code is 400 And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" @@ -53,11 +53,11 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession And the response property "$.code" is "OUT_OF_RANGE" And the response property "$.message" is "Client specified an invalid range." - @network_slice_booking_getSession_04_missing_authorization_scenario + @network_slice_booking_getSlice_04_missing_authorization_scenario Scenario: Error response for no header "Authorization" Given the header "Authorization" is not sent And the request body is set to a valid request body - When the request "getSession" is sent + When the request "getSlice" is sent Then the response status code is 401 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -65,10 +65,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession And the response property "$.code" is "UNAUTHENTICATED" And the response property "$.message" contains a user friendly text - @network_slice_booking_getSession_05_missing_access_token_scope_scenario + @network_slice_booking_getSlice_05_missing_access_token_scope_scenario Scenario: Missing access token scope - Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:sessions:get - When the request "getSession" is sent + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:get + When the request "getSlice" is sent Then the response status code is 403 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -76,10 +76,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - @network_slice_booking_getSession_06_resource_not_found_scenario + @network_slice_booking_getSlice_06_resource_not_found_scenario Scenario: Error response for not found resouce - Given an correct format and not existing network slice session id - When the request "getSession" is sent + Given an correct format and not existing network slice id + When the request "getSlice" is sent Then the response status code is 404 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" @@ -87,10 +87,10 @@ Feature: CAMARA Network Slice Booking API v0.1.0 - Operation getSession And the response property "$.code" is "NOT_FOUND" And the response property "$.message" is "The specified resource is not found." - @network_slice_booking_getSession_07_too_many_requests_scenario + @network_slice_booking_getSlice_07_too_many_requests_scenario Scenario: Error response for too many requests Given the right request body property argument - When the request "getSession" is sent + When the request "getSlice" is sent Then the response status code is 429 And the response header "x-correlator" has same value as the request header "x-correlator" And the response header "Content-Type" is "application/json" From 32f22fe34d599fcc7d7906cc8babfb62ff7037fb Mon Sep 17 00:00:00 2001 From: XunliYang Date: Thu, 13 Nov 2025 16:53:09 +0800 Subject: [PATCH 06/13] Modify device and use sliceId --- .../network-slice-assignment.yaml | 430 ++++++++++++------ 1 file changed, 286 insertions(+), 144 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index 7d86f90..44f47b8 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -2,26 +2,26 @@ openapi: 3.0.3 info: title: Network Slice Assignment description: | - This API enables the assignment and release of devices to an existing network slice session, as well as retrieving information about devices assigned to a session or sessions assigned to a device. + This API enables the assignment and release of the device to an existing network slice, as well as retrieving information about devices assigned to a slice or slices assigned to a device. - This API works with the Network Slice Booking API, which is responsible for creating and managing network slice sessions. The Network Slice Assignment API allows API consumers to manage user subscription to the network slices. + This API works with the Network Slice Booking API, which is responsible for creating and managing network slices. The Network Slice Assignment API allows API consumers to manage user subscription to the network slices. # Functionality The Network Slice Assignment API provides the following functionalities: - - **Assign Devices**: Allows the API consumer to assign devices to an existing network slice session, ensuring that the number of devices does not exceed the maximum defined in the slice QoS profile. - - **Release Devices**: Enables the API consumer to release devices from an existing network slice session. - - **Get Assigned Devices**: Retrieves information about devices currently assigned to a specific network slice session. - - **Retrieve Sessions by Device**: Retrieves the list of network slice sessions to which a specific device is assigned. + - **Assign Device**: Allows the API consumer to assign a device to an existing network slice, ensuring that the number of devices does not exceed the maximum defined in the slice QoS profile. + - **Release Device**: Enables the API consumer to release a device from an existing network slice. + - **Get Assigned Devices**: Retrieves information about devices currently assigned to a specific network slice. + - **Retrieve Slices by Device**: Retrieves the list of network slices to which a specific device is assigned. # Terms and Definitions * **Notification Sink and Token**: - API consumers can provide a notification sink URL and an optional sink credential when assigning devices to a session. The notification sink is the URL where the API response will be asynchronously delivered, using the HTTP protocol. The sink credential provides authentication or authorization information necessary to enable delivery of events to the target. + API consumers can provide a notification sink URL and an optional sink credential when assigning a device to a slice. The notification sink is the URL where the API response will be asynchronously delivered, using the HTTP protocol. The sink credential provides authentication or authorization information necessary to enable delivery of events to the target. # Parameters * **sliceQosProfile**: A set of quality of service parameters that define the requirements for the network slice. It includes parameters such as maximum number of devices, downlink and uplink throughput per device, and latency requirements. - * **sessionId**: A unique identifier for a network slice session, obtained from the createSession operation of the Network Slice Booking API. + * **sliceId**: A unique identifier for a network slice, obtained from the createSlice operation of the Network Slice Booking API. # Authorization and authentication @@ -31,6 +31,15 @@ info: In cases where personal data is processed by the API and users can exercise their rights through mechanisms such as opt-in and/or opt-out, the use of three-legged access tokens is mandatory. This ensures that the API remains in compliance with privacy regulations, upholding the principles of transparency and user-centric privacy-by-design. + # Identifying the device from the access token + + This API requires the API consumer to identify a device as the subject of the API as follows: + - When the API is invoked using a two-legged access token, the subject will be identified from the optional `device` object, which therefore MUST be provided. + + - When a three-legged access token is used however, this optional identifier MUST NOT be provided, as the subject will be uniquely identified from the access token. + + This approach simplifies API usage for API consumers using a three-legged access token to invoke the API by relying on the information that is associated with the access token and was identified during the authentication process. + # Additional CAMARA error responses The list of error codes in this API specification is not exhaustive. Therefore the API specification may not document some non-mandatory error statuses as indicated in `CAMARA API Design Guide`. @@ -57,38 +66,37 @@ tags: - name: Network Slice Assignment description: Manage Network Slice Assignment paths: - /sessions/{sessionId}/devices/assign: + /slices/devices/assign: post: tags: - Network Slice Assignment - summary: Assign devices to a network slice session + summary: Assign a device to a network slice description: | - Assign a device identified by its phone number to an existing network slice session. The number of devices assigned to the session must not exceed the maximum number defined in the slice QoS profile. + Assign a device to an existing network slice. The number of devices assigned to the slice must not exceed the maximum number defined in the slice QoS profile. - If the assignment operation is successful, the response will indicate the status as `SUCCESS`. - - If the number of devices exceeds the maximum allowed for the session, the response will indicate the status as `FAILURE` with statusInfo as `MAX_DEVICES_EXCEEDED`. - - Id the device is already assigned to the session, the response will indicate the status as `FAILURE` with statusInfo as `DEVICE_ALREADY_ASSIGNED`. + - If the number of devices exceeds the maximum allowed for the slice, the response will indicate the status as `FAILURE` with statusInfo as `MAX_DEVICES_EXCEEDED`. + - If the device is already assigned to the slice, the response will indicate the status as `FAILURE` with statusInfo as `DEVICE_ALREADY_ASSIGNED`. - If the assignment operation is still in progress, the response will indicate the status as `PENDING`. - operationId: assignDevices + + **NOTES:** + - The access token may be either 2-legged or 3-legged. See "Identifying the device from the access token" for further information + - When the API is invoked using a two-legged access token, the subject will be identified from the optional `device` object, which therefore MUST be provided. + - When a three-legged access token is used however, this optional identifier MUST NOT be provided, as the subject will be uniquely identified from the access token. + operationId: assignDevice security: - openId: - network-slice-assignment:devices:create parameters: - - name: sessionId - in: path - description: Session ID that was obtained from the createSession operation - required: true - schema: - $ref: "#/components/schemas/SessionId" - $ref: "#/components/parameters/x-correlator" requestBody: - description: Parameters to assign devices to a network slice session + description: Parameters to assign a device to a network slice content: application/json: schema: $ref: "#/components/schemas/DeviceInput" examples: - ASSIGN_DEVICES_INPUT: - $ref: "#/components/examples/ASSIGN_DEVICES_INPUT_NUMBER" + ASSIGN_DEVICE_INPUT: + $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" required: true callbacks: networkSliceAssignmentSinkCallback: @@ -138,14 +146,14 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/DeviceOutput" + $ref: "#/components/schemas/DeviceAssignmentInfo" examples: - ASSIGN_DEVICES_SUCCESSFUL: - $ref: "#/components/examples/ASSIGN_DEVICES_SUCCESSFUL" - ASSIGN_DEVICES_FAILURE_EXCEEDED: - $ref: "#/components/examples/ASSIGN_DEVICES_FAILURE_EXCEEDED" - ASSIGN_DEVICES_ALREADY_ASSIGNED: - $ref: "#/components/examples/ASSIGN_DEVICES_ALREADY_ASSIGNED" + ASSIGN_DEVICE_SUCCESSFUL: + $ref: "#/components/examples/ASSIGN_DEVICE_SUCCESSFUL" + ASSIGN_DEVICE_FAILURE_EXCEEDED: + $ref: "#/components/examples/ASSIGN_DEVICE_FAILURE_EXCEEDED" + ASSIGN_DEVICE_ALREADY_ASSIGNED: + $ref: "#/components/examples/ASSIGN_DEVICE_ALREADY_ASSIGNED" "400": $ref: "#/components/responses/Generic400" "401": @@ -159,36 +167,35 @@ paths: "429": $ref: "#/components/responses/Generic429" - /sessions/{sessionId}/devices/release: + /slices/devices/release: post: tags: - Network Slice Assignment - summary: Release devices from a network slice session + summary: Release a device from an exsiting network slice description: | - Unbind devices to an existing network slice session. - - If a device is not assigned to the session, it will return `FAILURE` status with statusInfo as `DEVICE_NOT_ASSIGNED` for that device in the response. - - If a device is successfully released from the session, it will return `SUCCESS` status. - operationId: releaseDevices + Unbind a device to an existing network slice. + - If a device is not assigned to the slice, it will return `FAILURE` status with statusInfo as `DEVICE_NOT_ASSIGNED` for that device in the response. + - If a device is successfully released from the slice, it will return `SUCCESS` status. + + **NOTES:** + - The access token may be either 2-legged or 3-legged. See "Identifying the device from the access token" for further information + - When the API is invoked using a two-legged access token, the subject will be identified from the optional `device` object, which therefore MUST be provided. + - When a three-legged access token is used however, this optional identifier MUST NOT be provided, as the subject will be uniquely identified from the access token. + operationId: releaseDevice security: - openId: - network-slice-assignment:devices:delete parameters: - - name: sessionId - in: path - description: Session ID that was obtained from the createSession operation - required: true - schema: - $ref: "#/components/schemas/SessionId" - $ref: "#/components/parameters/x-correlator" requestBody: - description: Parameters to release devices from a network slice session + description: Parameters to release a device from a network slice content: application/json: schema: $ref: "#/components/schemas/ReleaseDeviceInput" examples: - RELEASE_DEVICES_INPUT_NUMBER: - $ref: "#/components/examples/RELEASE_DEVICES_INPUT_NUMBER" + RELEASE_DEVICE_INPUT_NUMBER: + $ref: "#/components/examples/RELEASE_DEVICE_INPUT_NUMBER" required: true responses: "200": @@ -199,10 +206,10 @@ paths: content: application/json: schema: - $ref: "#/components/schemas/DeviceOutput" + $ref: "#/components/schemas/DeviceReleaseInfo" examples: - RELEASE_DEVICES_SUCCESSFUL: - $ref: "#/components/examples/RELEASE_DEVICES_SUCCESSFUL" + RELEASE_DEVICE_SUCCESSFUL: + $ref: "#/components/examples/RELEASE_DEVICE_SUCCESSFUL" "400": $ref: "#/components/responses/Generic400" "401": @@ -216,35 +223,35 @@ paths: "429": $ref: "#/components/responses/Generic429" - /sessions/{sessionId}/devices/get: + /slices/devices/get/{sliceId}: get: tags: - Network Slice Assignment - summary: Get devices assigned to a network slice session + summary: Get devices assigned to a network slice description: | - Get information about devices assigned to an existing network slice session. + Get information about devices assigned to an existing network slice. operationId: getDevices security: - openId: - network-slice-assignment:devices:get parameters: - - name: sessionId + - name: sliceId in: path - description: Session ID that was obtained from the createSession operation + description: Slice ID that was obtained from the createSlice operation required: true schema: - $ref: "#/components/schemas/SessionId" + $ref: "#/components/schemas/SliceId" - $ref: "#/components/parameters/x-correlator" responses: "200": - description: Contains information about active session + description: Contains information about active slice headers: x-correlator: $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/SessionDevice" + $ref: "#/components/schemas/SliceDevice" examples: GET_DEVICES_SUCCESSFUL: $ref: "#/components/examples/GET_DEVICES_SUCCESSFUL" @@ -259,39 +266,39 @@ paths: "429": $ref: "#/components/responses/Generic429" - /sessions/devices/retrieve: + /slices/devices/retrieve: post: tags: - Network Slice Assignment - summary: Retrieve all network slice sessions corresponds to a device + summary: Retrieve all network slices corresponds to a device description: | - Retrieve the list of network slice sessions to which a device is assigned. - operationId: retrieveSessionsByDevice + Retrieve the list of network slices to which a device is assigned. + operationId: retrieveSlicesByDevice security: - openId: - network-slice-assignment:devices:retrieve parameters: - $ref: "#/components/parameters/x-correlator" requestBody: - description: Parameters to retrieve sessions by device + description: Parameters to retrieve slices by device content: application/json: schema: - $ref: "#/components/schemas/PhoneNumber" + $ref: "#/components/schemas/Device" examples: RETRIEVE_INPUT_PHONENUMBER: $ref: "#/components/examples/RETRIEVE_INPUT_PHONENUMBER" required: true responses: "200": - description: List of sessions the device is assigned to + description: List of slices the device is assigned headers: x-correlator: $ref: "#/components/headers/x-correlator" content: application/json: schema: - $ref: "#/components/schemas/RetrievedSessionsOutput" + $ref: "#/components/schemas/RetrievedSlicesOutput" examples: RETRIEVE_SUCCESSFUL: $ref: "#/components/examples/RETRIEVE_SUCCESSFUL" @@ -329,16 +336,18 @@ components: type: string pattern: ^[a-zA-Z0-9-_:;.\/<>{}]{0,256}$ example: "b4333c46-49c0-4f62-80d7-f0ef930f1c46" - SessionId: - description: Session ID in UUID format + SliceId: + description: Slice ID in UUID format type: string format: uuid DeviceInput: - description: Request to add devices to a session + description: Request to add device to a slice type: object properties: - phoneNumber: - $ref: "#/components/schemas/PhoneNumber" + device: + $ref: "#/components/schemas/Device" + sliceId: + $ref: "#/components/schemas/SliceId" sink: type: string format: uri @@ -349,42 +358,124 @@ components: allOf: - $ref: "#/components/schemas/SinkCredential" required: - - phoneNumber + - sliceId + Device: + description: | + End-user equipment able to connect to a mobile network. Examples of devices include smartphones or IoT sensors/actuators. + The developer can choose to provide the below specified device identifiers: + * `ipv4Address` + * `ipv6Address` + * `phoneNumber` + * `networkAccessIdentifier` + NOTE1: the network operator might support only a subset of these options. The API invoker can provide multiple identifiers to be compatible across different network operators. In this case the identifiers MUST belong to the same device. + NOTE2: as for this Commonalities release, we are enforcing that the networkAccessIdentifier is only part of the schema for future-proofing, and CAMARA does not currently allow its use. After the CAMARA meta-release work is concluded and the relevant issues are resolved, its use will need to be explicitly documented in the guidelines. + type: object + properties: + phoneNumber: + $ref: "#/components/schemas/PhoneNumber" + networkAccessIdentifier: + $ref: "#/components/schemas/NetworkAccessIdentifier" + ipv4Address: + $ref: "#/components/schemas/DeviceIpv4Addr" + ipv6Address: + $ref: "#/components/schemas/DeviceIpv6Address" + minProperties: 1 + DeviceResponse: + description: | + An identifier for the end-user equipment able to connect to the network that the response refers to. This parameter is only returned when the API consumer includes the `device` parameter in their request (i.e. they are using a two-legged access token), and is relevant when more than one device identifier is specified, as only one of those device identifiers is allowed in the response. + + If the API consumer provides more than one device identifier in their request, and this schema is included in the response definition, the API provider MUST use it to return a single identifier which is the one they are using to fulfil the request, even if the identifiers do not match the same device. API provider does not perform any logic to validate/correlate that the indicated device identifiers match the same device. No error should be returned if the identifiers are otherwise valid to prevent API consumers correlating different identifiers with a given end user. + + allOf: + - $ref: "#/components/schemas/Device" + - maxProperties: 1 PhoneNumber: description: A public identifier addressing a telephone subscription. In mobile networks it corresponds to the MSISDN (Mobile Station International Subscriber Directory Number). In order to be globally unique it has to be formatted in international format, according to E.164 standard, prefixed with '+'. type: string pattern: '^\+[1-9][0-9]{4,14}$' example: "+123456789" + + NetworkAccessIdentifier: + description: A public identifier addressing a subscription in a mobile network. In 3GPP terminology, it corresponds to the GPSI formatted with the External Identifier ({Local Identifier}@{Domain Identifier}). Unlike the telephone number, the network access identifier is not subjected to portability ruling in force, and is individually managed by each operator. + type: string + example: "123456789@example.com" + + DeviceIpv4Addr: + type: object + description: | + The device should be identified by either the public (observed) IP address and port as seen by the application server, or the private (local) and any public (observed) IP addresses in use by the device (this information can be obtained by various means, for example from some DNS servers). + + If the allocated and observed IP addresses are the same (i.e. NAT is not in use) then the same address should be specified for both publicAddress and privateAddress. + + If NAT64 is in use, the device should be identified by its publicAddress and publicPort, or separately by its allocated IPv6 address (field ipv6Address of the Device object) + + In all cases, publicAddress must be specified, along with at least one of either privateAddress or publicPort, dependent upon which is known. In general, mobile devices cannot be identified by their public IPv4 address alone. + properties: + publicAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + privateAddress: + $ref: "#/components/schemas/SingleIpv4Addr" + publicPort: + $ref: "#/components/schemas/Port" + anyOf: + - required: [publicAddress, privateAddress] + - required: [publicAddress, publicPort] + example: + publicAddress: "84.125.93.10" + publicPort: 59765 + SingleIpv4Addr: + description: A single IPv4 address with no subnet mask + type: string + format: ipv4 + example: "84.125.93.10" + + Port: + description: TCP or UDP port number + type: integer + minimum: 0 + maximum: 65535 + + DeviceIpv6Address: + description: | + The device should be identified by the observed IPv6 address, or by any single IPv6 address from within the subnet allocated to the device (e.g. adding ::0 to the /64 prefix). + type: string + format: ipv6 + example: 2001:db8:85a3:8d3:1319:8a2e:370:7344 + ReleaseDeviceInput: - description: Request to release devices from a session + description: Request to release a device from a slice type: object properties: - phoneNumber: - $ref: "#/components/schemas/PhoneNumber" + device: + $ref: "#/components/schemas/Device" + sliceId: + $ref: "#/components/schemas/SliceId" required: - - phoneNumber - DeviceOutput: - description: Response after assigning devices to a session + - device + - sliceId + DeviceAssignmentInfo: + description: | + Information about the device assignment operation returned in the response. + - If more than one type of device identifier is provided in the request, only one identifier will be returned. + - In some situations (ex: assignments using 3-legged access token) the device details should not be disclosed as per the privacy and other legal requirements. type: object properties: - sessionId: - $ref: "#/components/schemas/SessionId" - phoneNumber: - $ref: "#/components/schemas/PhoneNumber" + device: + $ref: "#/components/schemas/DeviceResponse" + sliceId: + $ref: "#/components/schemas/SliceId" status: $ref: "#/components/schemas/AssignmentStatus" statusInfo: $ref: "#/components/schemas/AssignmentStatusInfo" required: - - sessionId - - phoneNumber + - sliceId - status - - statusInfo AssignmentStatus: description: | Status of the device assignment operation - * `SUCCESS` - All devices were successfully assigned to the session - * `FAILURE` - No devices were assigned to the session + * `SUCCESS` - Device is successfully assigned to the slice + * `FAILURE` - Device fail to assign to the slice * `PENDING` - The assignment operation is still in progress type: string enum: @@ -395,51 +486,89 @@ components: description: | Additional information about the assignment status * `ASSIGNMENT_COMPLETED` - The assignment operation has been completed - * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the session - * `DEVICE_ALREADY_ASSIGNED` - Devices are already assigned to the session - * `DEVICE_NOT_ASSIGNED` - Devices are not assigned to the session + * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the slice + * `DEVICE_ALREADY_ASSIGNED` - Device is already assigned to the slice + * `DEVICE_NOT_ASSIGNED` - Device fail to assign to the slice type: string enum: - ASSIGNMENT_COMPLETED - MAX_DEVICES_EXCEEDED - DEVICE_ALREADY_ASSIGNED - DEVICE_NOT_ASSIGNED - RetrievedSessionsOutput: - description: Response containing sessions assigned to a device + DeviceReleaseInfo: + description: | + Information about the device release from network slice operation returned in the response. + - If more than one type of device identifier is provided in the request, only one identifier will be returned. + - In some situations (ex: assignments using 3-legged access token) the device details should not be disclosed as per the privacy and other legal requirements. + type: object + properties: + device: + $ref: "#/components/schemas/DeviceResponse" + sliceId: + $ref: "#/components/schemas/SliceId" + status: + $ref: "#/components/schemas/ReleaseStatus" + statusInfo: + $ref: "#/components/schemas/ReleaseStatusInfo" + required: + - sliceId + - status + ReleaseStatus: + description: | + Status of the device release operation + * `SUCCESS` - Device is successfully released from the slice + * `FAILURE` - Device fail to release from the slice + type: string + enum: + - SUCCESS + - FAILURE + ReleaseStatusInfo: + description: | + Additional information about the release status + * `RELEASE_COMPLETED` - The release operation has been completed + * `DEVICE_ALREADY_RELEASED` - Device is already released from the slice + * `DEVICE_NOT_RELEASED` - Device fail to release from the slice + type: string + enum: + - RELEASE_COMPLETED + - DEVICE_ALREADY_RELEASED + - DEVICE_NOT_RELEASED + RetrievedSlicesOutput: + description: Response containing slices assigned to a device type: object properties: sliceList: type: array items: - $ref: "#/components/schemas/SessionInfo" + $ref: "#/components/schemas/SliceInfo" minItems: 0 - SessionDevice: - description: Information about devices assigned to a session + SliceDevice: + description: Information about devices assigned to a slice type: object properties: deviceList: type: array items: - $ref: "#/components/schemas/PhoneNumber" + $ref: "#/components/schemas/Device" minItems: 0 sliceInfo: - $ref: "#/components/schemas/SessionInfo" + $ref: "#/components/schemas/SliceInfo" required: - deviceList - sliceInfo - SessionInfo: - description: Session related information. + SliceInfo: + description: Slice related information. allOf: - - $ref: "#/components/schemas/CreateSession" + - $ref: "#/components/schemas/CreateSlice" - type: object properties: - sessionId: - $ref: "#/components/schemas/SessionId" + sliceId: + $ref: "#/components/schemas/SliceId" required: - - sessionId - CreateSession: - description: Attributes required to create a session + - sliceId + CreateSlice: + description: Attributes required to create a slice type: object properties: serviceTime: @@ -711,7 +840,7 @@ components: type: string description: The type of the event enum: - - "org.camaraproject.network-slice-booking.v1.session-created" + - "org.camaraproject.network-slice-booking.v1.slice-created" minLength: 25 specversion: type: string @@ -731,18 +860,18 @@ components: discriminator: propertyName: type mapping: - org.camaraproject.network-slice-booking.v1.session-created: "#/components/schemas/SessionCreatedEventData" + org.camaraproject.network-slice-booking.v1.slice-created: "#/components/schemas/SliceCreatedEventData" - SessionCreatedEventData: - description: Data for session created event + SliceCreatedEventData: + description: Data for slice created event allOf: - $ref: "#/components/schemas/CloudEvent" - type: object properties: data: - description: Details of the created session + description: Details of the created slice allOf: - - $ref: "#/components/schemas/SessionInfo" + - $ref: "#/components/schemas/SliceInfo" required: - data @@ -978,7 +1107,7 @@ components: - IDENTIFIER_NOT_FOUND examples: GENERIC_404_NOT_FOUND: - description: Specified slice resource is not found based on the sessionId + description: Specified slice resource is not found based on the sliceId value: status: 404 code: NOT_FOUND @@ -1038,7 +1167,7 @@ components: value: status: 422 code: NETWORK_SLICE_BOOKING.RESOURCES_NOT_APPLICABLE - message: The request resources are not applicable for session creation. + message: The request resources are not applicable for slice creation. Generic422: description: Unprocessable Content headers: @@ -1130,8 +1259,9 @@ components: datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "ASSIGNMENT_COMPLETED" ASSIGNMENT_DEVICE_EXCEED_EVENT: @@ -1145,16 +1275,18 @@ components: datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "FAILURE" statusInfo: "MAX_DEVICES_EXCEEDED" - ASSIGN_DEVICES_INPUT_NUMBER: - summary: Assign devices - Phone Number Identifier - description: Example of request to assign devices to a network slice using phone number identifier + ASSIGN_DEVICE_INPUT_NUMBER: + summary: Assign device - Phone Number Identifier + description: Example of request to assign a device to a network slice using phone number identifier value: device: - - phoneNumber: "+123456789" + phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" sink: "https://endpoint.example.com/sink" sinkCredential: @@ -1162,51 +1294,60 @@ components: accessToken: "" accessTokenExpiresUtc: "2025-12-31T23:59:59Z" accessTokenType: bearer - ASSIGN_DEVICES_SUCCESSFUL: + ASSIGN_DEVICE_SUCCESSFUL: summary: Assignment Successful - description: Example of successful response for assigning devices to a network slice request + description: Example of successful response for assigning a device to a network slice request value: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "ASSIGNMENT_COMPLETED" - ASSIGN_DEVICES_FAILURE_EXCEEDED: + ASSIGN_DEVICE_FAILURE_EXCEEDED: summary: Assignment Failure for DeviceNum Exceeded - description: Example of failure response for assigning devices to a network slice request due to maximum devices exceeded + description: Example of failure response for assigning a device to a network slice request due to maximum devices exceeded value: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "FAILURE" statusInfo: "MAX_DEVICES_EXCEEDED" - ASSIGN_DEVICES_ALREADY_ASSIGNED: + ASSIGN_DEVICE_ALREADY_ASSIGNED: summary: Assignment Failure for Device Already Assigned - description: Example of failure response for assigning devices to a network slice request due to device already assigned + description: Example of failure response for assigning a device to a network slice request due to device already assigned value: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "FAILURE" statusInfo: "DEVICE_ALREADY_ASSIGNED" - RELEASE_DEVICES_INPUT_NUMBER: - summary: Release devices - Phone Number Identifier - description: Example of request to assign devices to a network slice using phone number identifier + RELEASE_DEVICE_INPUT_NUMBER: + summary: Release device - Phone Number Identifier + description: Example of request to assign a device to a network slice using phone number identifier value: - phoneNumber: "+123456789" + device: + phoneNumber: "+123456789" - RELEASE_DEVICES_SUCCESSFUL: + RELEASE_DEVICE_SUCCESSFUL: summary: Release Successful - description: Example of successful response for releasing devices from a network slice request + description: Example of successful response for releasing a device from a network slice request value: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" status: "SUCCESS" - statusInfo: "ASSIGNMENT_COMPLETED" + statusInfo: "RELEASE_COMPLETED" GET_DEVICES_SUCCESSFUL: summary: Get Devices Successful description: Example of successful response for getting devices assigned to a network slice request value: - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + deviceList: + - device: + phoneNumber: "+123456789" + - device: + phoneNumber: "+987654321" sliceInfo: serviceTime: startDate: "2024-06-01T12:00:00Z" @@ -1235,7 +1376,8 @@ components: summary: Retrieve Slice Info - Phone Number Identifier description: Example of request to retrieve network slice info using phone number identifier value: - phoneNumber: "+123456789" + device: + phoneNumber: "+123456789" RETRIEVE_SUCCESSFUL: summary: Retrieve Slice Info Successful description: Example of successful response for retrieving network slice info request @@ -1264,5 +1406,5 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" \ No newline at end of file From 15ae580c6b9b2127d4352d0847698a33bcd75043 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Fri, 14 Nov 2025 10:10:58 +0800 Subject: [PATCH 07/13] Modify statusInfo of assignment and release --- .../network-slice-assignment.yaml | 20 ++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index 44f47b8..b340443 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -174,8 +174,8 @@ paths: summary: Release a device from an exsiting network slice description: | Unbind a device to an existing network slice. - - If a device is not assigned to the slice, it will return `FAILURE` status with statusInfo as `DEVICE_NOT_ASSIGNED` for that device in the response. - - If a device is successfully released from the slice, it will return `SUCCESS` status. + - If the release operation is successful, the response will indicate the status as `SUCCESS` with statusInfo as `RELEASE_COMPLETED`. + - If the device is not assigned to the slice, the response will indicate the status as `FAILURE` with statusInfo as `DEVICE_ALREADY_RELEASED`. **NOTES:** - The access token may be either 2-legged or 3-legged. See "Identifying the device from the access token" for further information @@ -308,6 +308,8 @@ paths: $ref: "#/components/responses/Generic401" "403": $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" "429": $ref: "#/components/responses/Generic429" components: @@ -488,13 +490,15 @@ components: * `ASSIGNMENT_COMPLETED` - The assignment operation has been completed * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the slice * `DEVICE_ALREADY_ASSIGNED` - Device is already assigned to the slice - * `DEVICE_NOT_ASSIGNED` - Device fail to assign to the slice + * `SLICE_NOT_FOUND` - The specified sliceId does not exist + * `ASSIGNMENT_UNKOWN_ERROR` - The assignment operation failed due to an unknown error type: string enum: - ASSIGNMENT_COMPLETED - MAX_DEVICES_EXCEEDED - DEVICE_ALREADY_ASSIGNED - - DEVICE_NOT_ASSIGNED + - SLICE_NOT_FOUND + - ASSIGNMENT_UNKOWN_ERROR DeviceReleaseInfo: description: | Information about the device release from network slice operation returned in the response. @@ -527,12 +531,14 @@ components: Additional information about the release status * `RELEASE_COMPLETED` - The release operation has been completed * `DEVICE_ALREADY_RELEASED` - Device is already released from the slice - * `DEVICE_NOT_RELEASED` - Device fail to release from the slice + * `SLICE_NOT_FOUND` - The specified sliceId does not exist + * `RELEASE_UNKOWN_ERROR` - The release operation failed due to an unknown error type: string enum: - RELEASE_COMPLETED - DEVICE_ALREADY_RELEASED - - DEVICE_NOT_RELEASED + - SLICE_NOT_FOUND + - RELEASE_UNKOWN_ERROR RetrievedSlicesOutput: description: Response containing slices assigned to a device type: object @@ -1107,7 +1113,7 @@ components: - IDENTIFIER_NOT_FOUND examples: GENERIC_404_NOT_FOUND: - description: Specified slice resource is not found based on the sliceId + description: Resource is not found value: status: 404 code: NOT_FOUND From 3805684ae08c679752a0e8294460a3d29124463c Mon Sep 17 00:00:00 2001 From: XunliYang Date: Fri, 14 Nov 2025 10:34:39 +0800 Subject: [PATCH 08/13] Add 2-legged authentication explanation --- code/API_definitions/network-slice-booking.yaml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index b4faee6..d51fc54 100644 --- a/code/API_definitions/network-slice-booking.yaml +++ b/code/API_definitions/network-slice-booking.yaml @@ -33,6 +33,8 @@ info: In cases where personal data is processed by the API and users can exercise their rights through mechanisms such as opt-in and/or opt-out, the use of three-legged access tokens is mandatory. This ensures that the API remains in compliance with privacy regulations, upholding the principles of transparency and user-centric privacy-by-design. + Network Slice Booking API does not involve the input and output of user personal data. Therefore, the access to Network Slice Booking API is defined as `Client Credentials - 2-legged`. Please refer to [Identify and Consent Management](https://github.com/camaraproject/IdentityAndConsentManagement/) for the latest detailed specification of this authentication/authorization flow. + # Additional CAMARA error responses The list of error codes in this API specification is not exhaustive. Therefore the API specification may not document some non-mandatory error statuses as indicated in `CAMARA API Design Guide`. From de1d88f91d293b36150be9a6337131c112dcfbc8 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Mon, 17 Nov 2025 14:29:40 +0800 Subject: [PATCH 09/13] Add example of all device identifiers --- .../network-slice-assignment.yaml | 44 +++++++++++++++++-- 1 file changed, 40 insertions(+), 4 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index b340443..3b5313c 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -95,8 +95,10 @@ paths: schema: $ref: "#/components/schemas/DeviceInput" examples: - ASSIGN_DEVICE_INPUT: - $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" + ASSIGN_DEVICE_INPUT_ALL: + $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_ALL" + ASSIGN_DEVICE_INPUT_NUMBER: + $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" required: true callbacks: networkSliceAssignmentSinkCallback: @@ -194,6 +196,8 @@ paths: schema: $ref: "#/components/schemas/ReleaseDeviceInput" examples: + RELEASE_DEVICE_INPUT_ALL: + $ref: "#/components/examples/RELEASE_DEVICE_INPUT_ALL" RELEASE_DEVICE_INPUT_NUMBER: $ref: "#/components/examples/RELEASE_DEVICE_INPUT_NUMBER" required: true @@ -343,7 +347,10 @@ components: type: string format: uuid DeviceInput: - description: Request to add device to a slice + description: | + Request to add device to a slice + **NOTES:** + - It is the responsibility of the API consumer to ensure that the identifiers they are using are associated with the same device. If unable to do that, only a single identifier SHOULD be provided to the API provider. type: object properties: device: @@ -1286,6 +1293,25 @@ components: phoneNumber: "+123456789" status: "FAILURE" statusInfo: "MAX_DEVICES_EXCEEDED" + ASSIGN_DEVICE_INPUT_ALL: + summary: Assign device - All Identifiers + description: Example of request to assign a device to a network slice using all identifiers + value: + device: + phoneNumber: "+123456789" + networkAccessIdentifier: "123456789@domain.com" + ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + sink: + "https://endpoint.example.com/sink" + sinkCredential: + credentialType: ACCESSTOKEN + accessToken: "" + accessTokenExpiresUtc: "2025-12-31T23:59:59Z" + accessTokenType: bearer ASSIGN_DEVICE_INPUT_NUMBER: summary: Assign device - Phone Number Identifier description: Example of request to assign a device to a network slice using phone number identifier @@ -1334,7 +1360,17 @@ components: value: device: phoneNumber: "+123456789" - + RELEASE_DEVICE_INPUT_ALL: + summary: Release device - All Identifiers + description: Example of request to assign a device to a network slice using all identifiers + value: + device: + phoneNumber: "+123456789" + networkAccessIdentifier: "123456789@domain.com" + ipv4Address: + publicAddress: "84.125.93.10" + publicPort: 59765 + ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" RELEASE_DEVICE_SUCCESSFUL: summary: Release Successful description: Example of successful response for releasing a device from a network slice request From ae126e9f6d4d79d8831dc3324f3f0e2a318fe207 Mon Sep 17 00:00:00 2001 From: XunliYang Date: Mon, 17 Nov 2025 15:48:29 +0800 Subject: [PATCH 10/13] Add response examples of assignment and release --- .../network-slice-assignment.yaml | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index 3b5313c..b741bff 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -156,6 +156,12 @@ paths: $ref: "#/components/examples/ASSIGN_DEVICE_FAILURE_EXCEEDED" ASSIGN_DEVICE_ALREADY_ASSIGNED: $ref: "#/components/examples/ASSIGN_DEVICE_ALREADY_ASSIGNED" + ASSIGN_DEVICE_SLICE_NOT_FOUND: + $ref: "#/components/examples/ASSIGN_DEVICE_SLICE_NOT_FOUND" + ASSIGN_DEVICE_UNKNOWN_ERROR: + $ref: "#/components/examples/ASSIGN_DEVICE_UNKNOWN_ERROR" + ASSIGN_DEVICE_PENDING: + $ref: "#/components/examples/ASSIGN_DEVICE_PENDING" "400": $ref: "#/components/responses/Generic400" "401": @@ -173,7 +179,7 @@ paths: post: tags: - Network Slice Assignment - summary: Release a device from an exsiting network slice + summary: Release a device from an existing network slice description: | Unbind a device to an existing network slice. - If the release operation is successful, the response will indicate the status as `SUCCESS` with statusInfo as `RELEASE_COMPLETED`. @@ -214,6 +220,12 @@ paths: examples: RELEASE_DEVICE_SUCCESSFUL: $ref: "#/components/examples/RELEASE_DEVICE_SUCCESSFUL" + RELEASE_DEVICE_ALREADY_RELEASED: + $ref: "#/components/examples/RELEASE_DEVICE_ALREADY_RELEASED" + RELEASE_DEVICE_SLICE_NOT_FOUND: + $ref: "#/components/examples/RELEASE_DEVICE_SLICE_NOT_FOUND" + RELEASE_DEVICE_UNKNOWN_ERROR: + $ref: "#/components/examples/RELEASE_DEVICE_UNKNOWN_ERROR" "400": $ref: "#/components/responses/Generic400" "401": @@ -498,14 +510,16 @@ components: * `MAX_DEVICES_EXCEEDED` - The number of devices exceeds the maximum allowed for the slice * `DEVICE_ALREADY_ASSIGNED` - Device is already assigned to the slice * `SLICE_NOT_FOUND` - The specified sliceId does not exist - * `ASSIGNMENT_UNKOWN_ERROR` - The assignment operation failed due to an unknown error + * `ASSIGNMENT_UNKNOWN_ERROR` - The assignment operation failed due to an unknown error + * `VALIDATION_PENDING` - The assignment request is pending for validation and verification type: string enum: - ASSIGNMENT_COMPLETED - MAX_DEVICES_EXCEEDED - DEVICE_ALREADY_ASSIGNED - SLICE_NOT_FOUND - - ASSIGNMENT_UNKOWN_ERROR + - ASSIGNMENT_UNKNOWN_ERROR + - VALIDATION_PENDING DeviceReleaseInfo: description: | Information about the device release from network slice operation returned in the response. @@ -539,13 +553,13 @@ components: * `RELEASE_COMPLETED` - The release operation has been completed * `DEVICE_ALREADY_RELEASED` - Device is already released from the slice * `SLICE_NOT_FOUND` - The specified sliceId does not exist - * `RELEASE_UNKOWN_ERROR` - The release operation failed due to an unknown error + * `RELEASE_UNKNOWN_ERROR` - The release operation failed due to an unknown error type: string enum: - RELEASE_COMPLETED - DEVICE_ALREADY_RELEASED - SLICE_NOT_FOUND - - RELEASE_UNKOWN_ERROR + - RELEASE_UNKNOWN_ERROR RetrievedSlicesOutput: description: Response containing slices assigned to a device type: object @@ -1353,7 +1367,33 @@ components: phoneNumber: "+123456789" status: "FAILURE" statusInfo: "DEVICE_ALREADY_ASSIGNED" - + ASSIGN_DEVICE_SLICE_NOT_FOUND: + summary: Assignment Failure for Slice Not Found + description: Example of failure response for assigning a device to a network slice request due to sliceId not found + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "SLICE_NOT_FOUND" + ASSIGN_DEVICE_UNKNOWN_ERROR: + summary: Assignment Failure for Unknown Error + description: Example of failure response for assigning a device to a network slice request due to unknown error + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "ASSIGNMENT_UNKNOWN_ERROR" + ASSIGN_DEVICE_PENDING: + summary: Assignment Pending + description: Example of pending response for assigning a device to a network slice request + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "PENDING" + statusInfo: "VALIDATION_PENDING" RELEASE_DEVICE_INPUT_NUMBER: summary: Release device - Phone Number Identifier description: Example of request to assign a device to a network slice using phone number identifier @@ -1380,6 +1420,33 @@ components: phoneNumber: "+123456789" status: "SUCCESS" statusInfo: "RELEASE_COMPLETED" + RELEASE_DEVICE_ALREADY_RELEASED: + summary: Release Failure for Device Already Released + description: Example of failure response for releasing a device from a network slice request due to device already not assigned to the slice + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "DEVICE_ALREADY_RELEASED" + RELEASE_DEVICE_SLICE_NOT_FOUND: + summary: Release Failure for Slice Not Found + description: Example of failure response for releasing a device from a network slice request due to sliceId not found + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "SLICE_NOT_FOUND" + RELEASE_DEVICE_UNKNOWN_ERROR: + summary: Release Failure for Unknown Error + description: Example of failure response for releasing a device from a network slice request due to unknown error + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "RELEASE_UNKNOWN_ERROR" GET_DEVICES_SUCCESSFUL: summary: Get Devices Successful description: Example of successful response for getting devices assigned to a network slice request From 5df5ec952d5bd32047f554e93319fa16a291860b Mon Sep 17 00:00:00 2001 From: ChinaUnicomXiaoDongrui Date: Tue, 18 Nov 2025 14:22:12 +0800 Subject: [PATCH 11/13] Add test files related to network slice assignment Add test files related to network slice assignment --- .../network-slice-assignment-assign.feature | 143 +++++++++++++++++ .../network-slice-assignment-get.feature | 150 ++++++++++++++++++ .../network-slice-assignment-release.feature | 147 +++++++++++++++++ .../network-slice-assignment-retrieve.feature | 148 +++++++++++++++++ 4 files changed, 588 insertions(+) create mode 100644 code/Test_definitions/network-slice-assignment-assign.feature create mode 100644 code/Test_definitions/network-slice-assignment-get.feature create mode 100644 code/Test_definitions/network-slice-assignment-release.feature create mode 100644 code/Test_definitions/network-slice-assignment-retrieve.feature diff --git a/code/Test_definitions/network-slice-assignment-assign.feature b/code/Test_definitions/network-slice-assignment-assign.feature new file mode 100644 index 0000000..9fd1b9d --- /dev/null +++ b/code/Test_definitions/network-slice-assignment-assign.feature @@ -0,0 +1,143 @@ +Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + # * List of device identifier types which are not supported, among: phoneNumber, ipv4Address, ipv6Address. + # * For this version, CAMARA does not allow the use of networkAccessIdentifier, so it is considered by default as not supported. + # + # References to OAS spec schemas refer to schemas specified in network-slice-assignment.yaml, version 0.1.0 + + Background: Common assignSlice setup + Given an environment at "apiRoot" + And the resource "/network-slice-assignment/v0.1/slices/devices/assign" + And the header "Content-Type" is set to "application/json" + And the header "Authorization" is set to a valid access token + And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" + +# Success scenarios + + @network_slice_booking_assignSlice_01_generic_success_scenario + Scenario: Common validations for any success scenario + Given a valid testing device supported by the service and slice id have already been allocated + When the request "assignSlice" is sent + Then the response status code is 201 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response body complies with the OAS schema at "/components/schemas/AssignmentInfo" + And the response property "$.sliceId" is a character string + And the response property "$.device" exists only if provided in the request body and with the same value + And the assigned status include in "SUCCESS" and "FAILURE" + And the corresponding status prompt information + + @network_slice_booking_assignSlice_02_invalid_argument_scenario + Scenario: Error response for invalid argument in request body + Given the request body property argument is invalid, such as illegal character and format error + When the request "assignSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "INVALID_ARGUMENT" + And the response property "$.message" is "Client specified an invalid argument, request body or query param." + + @network_slice_booking_assignSlice_03_out_of_range_scenario + Scenario: Error responses where the parameters in the request body are out of range + Given the request body property argument are out of range, for example maxNumOfDevices is a negative integer + When the request "assignSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "OUT_OF_RANGE" + And the response property "$.message" is "Client specified an invalid range." + + @network_slice_booking_assignSlice_04_missing_authorization_scenario + Scenario: Error response for no header "Authorization" + Given the header "Authorization" is not sent + And the request body is set to a valid request body + When the request "assignSlice" is sent + Then the response status code is 401 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 401 + And the response property "$.code" is "UNAUTHENTICATED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_assignSlice_05_missing_access_token_scope_scenario + Scenario: Missing access token scope + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:assign + When the request "assignSlice" is sent + Then the response status code is 403 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 403 + And the response property "$.code" is "PERMISSION_DENIED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_assignSlice_06_server_resource_not_found_scenario + Scenario: Error response for not found server resouce + Given an correct format and existing network slice id + When the request "assignSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_assignSlice_07_business_resource_not_found_scenario + Scenario: Error response for not found bussiness resouce + Given an correct format and not existing network slice id + When the request "assignSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "IDENTIFIER_NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_assignSlice_08_service_not_applicable_scenario + Scenario: Common validations for fail scenario of area not supported + Given the correct slice id is not supported by the service + When the request "assignSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" is "SERVICE_NOT_APPLICABLE" + And the response property "$.message" is "The service is not available for the provided identifier." + + @network_slice_booking_assignSlice_09_inapposite_identifier_scenario + Scenario: Common validations for fail scenario of inapposite identifier + Given inapposite identifier or identifier is lost + When the request "assignSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" such as "MISSING_IDENTIFIER", "UNSUPPORTED_IDENTIFIER" and "UNNECESSARY_IDENTIFIER" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_assignSlice_10_quota_exceeded_scenario + Scenario: Error response for quota exceeded + Given the right request body property argument + When the request "assignSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "QUOTA_EXCEEDED" + And the response property "$.message" is "Out of resource quota." + + @network_slice_booking_assignSlice_11_too_many_requests_scenario + Scenario: Error response for too many requests + Given the right request body property argument + When the request "assignSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "TOO_MANY_REQUESTS" + And the response property "$.message" is "Rate limit reached." diff --git a/code/Test_definitions/network-slice-assignment-get.feature b/code/Test_definitions/network-slice-assignment-get.feature new file mode 100644 index 0000000..6c37907 --- /dev/null +++ b/code/Test_definitions/network-slice-assignment-get.feature @@ -0,0 +1,150 @@ +Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get + + # Get information about devices assigned to an existing network slice. + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + # * List of device identifier types which are not supported, among: phoneNumber, ipv4Address, ipv6Address. + # * For this version, CAMARA does not allow the use of networkAccessIdentifier, so it is considered by default as not supported. + # + # References to OAS spec schemas refer to schemas specified in network-slice-assignment.yaml, version 0.1.0 + + Background: Common getDevice setup + Given an environment at "apiRoot" + And the resource "/network-slice-assignment/v0.1/slices/devices/get/{sliceId}" + And the header "Content-Type" is set to "application/json" + And the header "Authorization" is set to a valid access token + And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" + # Properties not explicitly overwritten in the Scenarios can take any values compliant with the schema + And the path parameter "sliceId" is set by default to a existing network slice id + +# Success scenarios + + @network_slice_booking_getDevice_01_generic_success_scenario + Scenario: Query the bound devices under the slice resouce + Given a slice id of a device that has already been bound + When the request "getDevice" is sent + Then the response status code is 200 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.sliceId" is a character string + And the response property "$.deviceList" is an array format that stores device information under slices + And the response property "$.sliceInfo" is a json format that stores the configuration information of slice resources + + @network_slice_booking_getDevice_02_invalid_argument_scenario + Scenario: Error response for invalid argument in request body + Given the request body property argument is invalid, such as illegal character and format error + When the request "getDevice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "INVALID_ARGUMENT" + And the response property "$.message" is "Client specified an invalid argument, request body or query param." + + @network_slice_booking_getDevice_03_out_of_range_scenario + Scenario: Error responses where the parameters in the request body are out of range + Given the request body property argument are out of range, for example maxNumOfDevices is a negative integer + When the request "getDevice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "OUT_OF_RANGE" + And the response property "$.message" is "Client specified an invalid range." + + @network_slice_booking_getDevice_04_missing_authorization_scenario + Scenario: Error response for no header "Authorization" + Given the header "Authorization" is not sent + And the request body is set to a valid request body + When the request "getDevice" is sent + Then the response status code is 401 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 401 + And the response property "$.code" is "UNAUTHENTICATED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_getDevice_05_missing_access_token_scope_scenario + Scenario: Missing access token scope + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:assign + When the request "getDevice" is sent + Then the response status code is 403 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 403 + And the response property "$.code" is "PERMISSION_DENIED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_getDevice_06_server_resource_not_found_scenario + Scenario: Error response for not found server resouce + Given an correct format and existing network slice id + When the request "getDevice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_getDevice_07_business_resource_not_found_scenario + Scenario: Error response for not found bussiness resouce + Given an correct format and not existing network slice id + When the request "getDevice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "IDENTIFIER_NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_getDevice_08_service_not_applicable_scenario + Scenario: Common validations for fail scenario of area not supported + Given the correct slice id is not supported by the service + When the request "getDevice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" is "SERVICE_NOT_APPLICABLE" + And the response property "$.message" is "The service is not available for the provided identifier." + + @network_slice_booking_getDevice_09_inapposite_identifier_scenario + Scenario: Common validations for fail scenario of inapposite identifier + Given inapposite identifier or identifier is lost + When the request "getDevice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" such as "MISSING_IDENTIFIER", "UNSUPPORTED_IDENTIFIER" and "UNNECESSARY_IDENTIFIER" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_getDevice_10_quota_exceeded_scenario + Scenario: Error response for quota exceeded + Given the right request body property argument + When the request "getDevice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "QUOTA_EXCEEDED" + And the response property "$.message" is "Out of resource quota." + + @network_slice_booking_getDevice_11_too_many_requests_scenario + Scenario: Error response for too many requests + Given the right request body property argument + When the request "getDevice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "TOO_MANY_REQUESTS" + And the response property "$.message" is "Rate limit reached." diff --git a/code/Test_definitions/network-slice-assignment-release.feature b/code/Test_definitions/network-slice-assignment-release.feature new file mode 100644 index 0000000..0f32553 --- /dev/null +++ b/code/Test_definitions/network-slice-assignment-release.feature @@ -0,0 +1,147 @@ +Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + + # Testing assets: + # * The AssignmentInfo of an existing Slice assignment + # * The AssignmentInfo of an existing Slice assignment with status "AVAILABLE", and with provided values for "sink" and "sinkCredential" + # + # References to OAS spec schemas refer to schemas specified in network-slice-assignment.yaml, version 0.1.0 + + Background: Common releaseSlice setup + Given an environment at "apiRoot" + And the resource "/network-slice-assignment/v0.1/slices/devices/release" + And the header "Content-Type" is set to "application/json" + And the header "Authorization" is set to a valid access token + And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" + # Properties not explicitly overwritten in the Scenarios can take any values compliant with the schema + And the path parameter "device" is set by default to a existing network slice id + +# Success scenarios + + @network_slice_booking_releaseSlice_01_generic_success_scenario + Scenario: Release the slice resources that have been allocated to the device + Given a valid testing device that has been allocated slices + When the request "releaseSlice" is sent + Then the response status code is 201 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.sliceId" is a character string + And the response property "$.device" exists only if provided in the request body and with the same value + And the response property "$.status" include in "SUCCESS" and "FAILURE" + And the response property "$.statusInfo" contains a user friendly text + + + @network_slice_booking_releaseSlice_02_invalid_argument_scenario + Scenario: Error response for invalid argument in request body + Given the request body property argument is invalid, such as illegal character and format error + When the request "releaseSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "INVALID_ARGUMENT" + And the response property "$.message" is "Client specified an invalid argument, request body or query param." + + @network_slice_booking_releaseSlice_03_out_of_range_scenario + Scenario: Error responses where the parameters in the request body are out of range + Given the request body property argument are out of range, for example maxNumOfDevices is a negative integer + When the request "releaseSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "OUT_OF_RANGE" + And the response property "$.message" is "Client specified an invalid range." + + @network_slice_booking_releaseSlice_04_missing_authorization_scenario + Scenario: Error response for no header "Authorization" + Given the header "Authorization" is not sent + And the request body is set to a valid request body + When the request "releaseSlice" is sent + Then the response status code is 401 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 401 + And the response property "$.code" is "UNAUTHENTICATED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_releaseSlice_05_missing_access_token_scope_scenario + Scenario: Missing access token scope + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:assign + When the request "releaseSlice" is sent + Then the response status code is 403 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 403 + And the response property "$.code" is "PERMISSION_DENIED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_releaseSlice_06_server_resource_not_found_scenario + Scenario: Error response for not found server resouce + Given an correct format and existing network slice id + When the request "releaseSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_releaseSlice_07_business_resource_not_found_scenario + Scenario: Error response for not found bussiness resouce + Given an correct format and not existing network slice id + When the request "releaseSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "IDENTIFIER_NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_releaseSlice_08_service_not_applicable_scenario + Scenario: Common validations for fail scenario of area not supported + Given the correct slice id is not supported by the service + When the request "releaseSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" is "SERVICE_NOT_APPLICABLE" + And the response property "$.message" is "The service is not available for the provided identifier." + + @network_slice_booking_releaseSlice_09_inapposite_identifier_scenario + Scenario: Common validations for fail scenario of inapposite identifier + Given inapposite identifier or identifier is lost + When the request "releaseSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" such as "MISSING_IDENTIFIER", "UNSUPPORTED_IDENTIFIER" and "UNNECESSARY_IDENTIFIER" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_releaseSlice_10_quota_exceeded_scenario + Scenario: Error response for quota exceeded + Given the right request body property argument + When the request "releaseSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "QUOTA_EXCEEDED" + And the response property "$.message" is "Out of resource quota." + + @network_slice_booking_releaseSlice_11_too_many_requests_scenario + Scenario: Error response for too many requests + Given the right request body property argument + When the request "releaseSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "TOO_MANY_REQUESTS" + And the response property "$.message" is "Rate limit reached." diff --git a/code/Test_definitions/network-slice-assignment-retrieve.feature b/code/Test_definitions/network-slice-assignment-retrieve.feature new file mode 100644 index 0000000..cf857ca --- /dev/null +++ b/code/Test_definitions/network-slice-assignment-retrieve.feature @@ -0,0 +1,148 @@ +Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve + + # Retrieve the list of network slices to which a device is assigned. + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + + # Input to be provided by the implementation to the tester + # + # Implementation indications: + # * apiRoot: API root of the server URL + # * List of device identifier types which are not supported, among: phoneNumber, ipv4Address, ipv6Address. + # * For this version, CAMARA does not allow the use of networkAccessIdentifier, so it is considered by default as not supported. + # + # References to OAS spec schemas refer to schemas specified in network-slice-assignment.yaml, version 0.1.0 + + Background: Common retrieveSlice setup + Given an environment at "apiRoot" + And the resource "/network-slice-assignment/v0.1/slices/devices/retrieve" + And the header "Content-Type" is set to "application/json" + And the header "Authorization" is set to a valid access token + And the header "x-correlator" complies with the schema at "#/components/schemas/XCorrelator" + # Properties not explicitly overwritten in the Scenarios can take any values compliant with the schema + And the path parameter "device" is the device information to be retrieved + +# Success scenarios + + @network_slice_booking_retrieveSlice_01_generic_success_scenario + Scenario: Retrieve the slice information bound to the device + Given a valid testing device that has been allocated slices + When the request "retrieveSlice" is sent + Then the response status code is 200 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.sliceList" is an array, with each element including the slice id, service area, service time, and slice configuration information + + @network_slice_booking_retrieveSlice_02_invalid_argument_scenario + Scenario: Error response for invalid argument in request body + Given the request body property argument is invalid, such as illegal character and format error + When the request "retrieveSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "INVALID_ARGUMENT" + And the response property "$.message" is "Client specified an invalid argument, request body or query param." + + @network_slice_booking_retrieveSlice_03_out_of_range_scenario + Scenario: Error responses where the parameters in the request body are out of range + Given the request body property argument are out of range, for example maxNumOfDevices is a negative integer + When the request "retrieveSlice" is sent + Then the response status code is 400 + And the response header "Content-Type" is "application/json" + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response property "$.status" is 400 + And the response property "$.code" is "OUT_OF_RANGE" + And the response property "$.message" is "Client specified an invalid range." + + @network_slice_booking_retrieveSlice_04_missing_authorization_scenario + Scenario: Error response for no header "Authorization" + Given the header "Authorization" is not sent + And the request body is set to a valid request body + When the request "retrieveSlice" is sent + Then the response status code is 401 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 401 + And the response property "$.code" is "UNAUTHENTICATED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_retrieveSlice_05_missing_access_token_scope_scenario + Scenario: Missing access token scope + Given the header "Authorization" is set to an access token that does not include scope network-slice-booking:slices:assign + When the request "retrieveSlice" is sent + Then the response status code is 403 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 403 + And the response property "$.code" is "PERMISSION_DENIED" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_retrieveSlice_06_server_resource_not_found_scenario + Scenario: Error response for not found server resouce + Given an correct format and existing network slice id + When the request "retrieveSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_retrieveSlice_07_business_resource_not_found_scenario + Scenario: Error response for not found bussiness resouce + Given an correct format and not existing network slice id + When the request "retrieveSlice" is sent + Then the response status code is 404 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 404 + And the response property "$.code" is "IDENTIFIER_NOT_FOUND" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_retrieveSlice_08_service_not_applicable_scenario + Scenario: Common validations for fail scenario of area not supported + Given the correct slice id is not supported by the service + When the request "retrieveSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" is "SERVICE_NOT_APPLICABLE" + And the response property "$.message" is "The service is not available for the provided identifier." + + @network_slice_booking_retrieveSlice_09_inapposite_identifier_scenario + Scenario: Common validations for fail scenario of inapposite identifier + Given inapposite identifier or identifier is lost + When the request "retrieveSlice" is sent + Then the response status code is 422 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 422 + And the response property "$.code" such as "MISSING_IDENTIFIER", "UNSUPPORTED_IDENTIFIER" and "UNNECESSARY_IDENTIFIER" + And the response property "$.message" contains a user friendly text + + @network_slice_booking_retrieveSlice_10_quota_exceeded_scenario + Scenario: Error response for quota exceeded + Given the right request body property argument + When the request "retrieveSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "QUOTA_EXCEEDED" + And the response property "$.message" is "Out of resource quota." + + @network_slice_booking_retrieveSlice_11_too_many_requests_scenario + Scenario: Error response for too many requests + Given the right request body property argument + When the request "retrieveSlice" is sent + Then the response status code is 429 + And the response header "x-correlator" has same value as the request header "x-correlator" + And the response header "Content-Type" is "application/json" + And the response property "$.status" is 429 + And the response property "$.code" is "TOO_MANY_REQUESTS" + And the response property "$.message" is "Rate limit reached." From 0f7353fd031b04cdd9c4a26d855c10cec0937b3f Mon Sep 17 00:00:00 2001 From: XunliYang Date: Tue, 25 Nov 2025 14:56:49 +0800 Subject: [PATCH 12/13] Modify the megalinter error --- .../network-slice-assignment.yaml | 39 +++++++++---------- .../network-slice-booking.yaml | 18 ++++----- .../network-slice-assignment-assign.feature | 12 +++--- .../network-slice-assignment-get.feature | 14 +++---- .../network-slice-assignment-release.feature | 13 +++---- .../network-slice-assignment-retrieve.feature | 12 +++--- 6 files changed, 53 insertions(+), 55 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index b741bff..ff2e39f 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -15,7 +15,7 @@ info: # Terms and Definitions - * **Notification Sink and Token**: + * **Notification Sink and Token**: API consumers can provide a notification sink URL and an optional sink credential when assigning a device to a slice. The notification sink is the URL where the API response will be asynchronously delivered, using the HTTP protocol. The sink credential provides authentication or authorization information necessary to enable delivery of events to the target. # Parameters @@ -77,7 +77,7 @@ paths: - If the number of devices exceeds the maximum allowed for the slice, the response will indicate the status as `FAILURE` with statusInfo as `MAX_DEVICES_EXCEEDED`. - If the device is already assigned to the slice, the response will indicate the status as `FAILURE` with statusInfo as `DEVICE_ALREADY_ASSIGNED`. - If the assignment operation is still in progress, the response will indicate the status as `PENDING`. - + **NOTES:** - The access token may be either 2-legged or 3-legged. See "Identifying the device from the access token" for further information - When the API is invoked using a two-legged access token, the subject will be identified from the optional `device` object, which therefore MUST be provided. @@ -98,7 +98,7 @@ paths: ASSIGN_DEVICE_INPUT_ALL: $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_ALL" ASSIGN_DEVICE_INPUT_NUMBER: - $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" + $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" required: true callbacks: networkSliceAssignmentSinkCallback: @@ -119,7 +119,7 @@ paths: $ref: "#/components/examples/ASSIGNMENT_COMPLETED_EVENT" ASSIGNMENT_DEVICE_EXCEED_EVENT: $ref: "#/components/examples/ASSIGNMENT_DEVICE_EXCEED_EVENT" - required: true + required: true responses: "204": description: Successful notification @@ -476,11 +476,11 @@ components: - sliceId DeviceAssignmentInfo: description: | - Information about the device assignment operation returned in the response. + Information about the device assignment operation returned in the response. - If more than one type of device identifier is provided in the request, only one identifier will be returned. - In some situations (ex: assignments using 3-legged access token) the device details should not be disclosed as per the privacy and other legal requirements. type: object - properties: + properties: device: $ref: "#/components/schemas/DeviceResponse" sliceId: @@ -522,11 +522,11 @@ components: - VALIDATION_PENDING DeviceReleaseInfo: description: | - Information about the device release from network slice operation returned in the response. + Information about the device release from network slice operation returned in the response. - If more than one type of device identifier is provided in the request, only one identifier will be returned. - In some situations (ex: assignments using 3-legged access token) the device details should not be disclosed as per the privacy and other legal requirements. type: object - properties: + properties: device: $ref: "#/components/schemas/DeviceResponse" sliceId: @@ -867,7 +867,7 @@ components: type: string description: The type of the event enum: - - "org.camaraproject.network-slice-booking.v1.slice-created" + - "org.camaraproject.network-slice-assignment.v0.status-changed" minLength: 25 specversion: type: string @@ -887,18 +887,18 @@ components: discriminator: propertyName: type mapping: - org.camaraproject.network-slice-booking.v1.slice-created: "#/components/schemas/SliceCreatedEventData" + org.camaraproject.network-slice-assignment.v0.status-changed: "#/components/schemas/AssignmentDeviceEvent" - SliceCreatedEventData: - description: Data for slice created event + AssignmentDeviceEvent: + description: Event to notify about device assignment status change allOf: - $ref: "#/components/schemas/CloudEvent" - type: object properties: data: - description: Details of the created slice + description: Event details depending on the event type allOf: - - $ref: "#/components/schemas/SliceInfo" + - $ref: "#/components/schemas/DeviceAssignmentInfo" required: - data @@ -937,7 +937,7 @@ components: - ACCESSTOKEN - REFRESHTOKEN description: | - The type of the credential. + The type of the credential. Note: Type of the credential - MUST be set to ACCESSTOKEN for now discriminator: propertyName: credentialType @@ -1169,7 +1169,7 @@ components: value: status: 410 code: GONE - message: Access to the target resource is no longer available. + message: Access to the target resource is no longer available. NetworkSliceBooking422: description: Unprocessable Content headers: @@ -1282,7 +1282,7 @@ components: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.assignment-completed" + type: "org.camaraproject.network-slice-assignment.v0.status-changed" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: @@ -1298,7 +1298,7 @@ components: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.assignment-device-exceed" + type: "org.camaraproject.network-slice-assignment.v0.status-changed" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: @@ -1314,7 +1314,7 @@ components: device: phoneNumber: "+123456789" networkAccessIdentifier: "123456789@domain.com" - ipv4Address: + ipv4Address: publicAddress: "84.125.93.10" publicPort: 59765 ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" @@ -1516,4 +1516,3 @@ components: value: 12 unit: Milliseconds sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" - \ No newline at end of file diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index d51fc54..a196c52 100644 --- a/code/API_definitions/network-slice-booking.yaml +++ b/code/API_definitions/network-slice-booking.yaml @@ -109,7 +109,7 @@ paths: SLICE_CREATED_EVENT_CIRCLE: $ref: "#/components/examples/SLICE_CREATED_EVENT_CIRCLE" SLICE_CREATED_EVENT_POLYGON: - $ref: "#/components/examples/SLICE_CREATED_EVENT_POLYGON" + $ref: "#/components/examples/SLICE_CREATED_EVENT_POLYGON" responses: "204": description: Successful notification @@ -559,7 +559,7 @@ components: type: string description: The type of the event enum: - - "org.camaraproject.network-slice-booking.v1.slice-created" + - "org.camaraproject.network-slice-booking.v0.status-changed" minLength: 25 specversion: type: string @@ -579,16 +579,16 @@ components: discriminator: propertyName: type mapping: - org.camaraproject.network-slice-booking.v1.slice-created: "#/components/schemas/SliceCreatedEventData" + org.camaraproject.network-slice-booking.v0.status-changed: "#/components/schemas/SliceCreatedEvent" - SliceCreatedEventData: - description: Data for slice created event + SliceCreatedEvent: + description: Event to notify a slice creation status change allOf: - $ref: "#/components/schemas/CloudEvent" - type: object properties: data: - description: Details of the created slice + description: Event details depending on the event type allOf: - $ref: "#/components/schemas/SliceInfo" required: @@ -629,7 +629,7 @@ components: - ACCESSTOKEN - REFRESHTOKEN description: | - The type of the credential. + The type of the credential. Note: Type of the credential - MUST be set to ACCESSTOKEN for now discriminator: propertyName: credentialType @@ -854,7 +854,7 @@ components: value: status: 410 code: GONE - message: Access to the target resource is no longer available. + message: Access to the target resource is no longer available. NetworkSliceBooking422: description: Unprocessable Content headers: @@ -1031,7 +1031,7 @@ components: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.slice-created" + type: "org.camaraproject.network-slice-booking.v0.status-changed" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: diff --git a/code/Test_definitions/network-slice-assignment-assign.feature b/code/Test_definitions/network-slice-assignment-assign.feature index 9fd1b9d..88c7369 100644 --- a/code/Test_definitions/network-slice-assignment-assign.feature +++ b/code/Test_definitions/network-slice-assignment-assign.feature @@ -27,9 +27,9 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response header "x-correlator" has same value as the request header "x-correlator" And the response body complies with the OAS schema at "/components/schemas/AssignmentInfo" And the response property "$.sliceId" is a character string - And the response property "$.device" exists only if provided in the request body and with the same value + And the response property "$.device" exists only if provided in the request body and with the same value And the assigned status include in "SUCCESS" and "FAILURE" - And the corresponding status prompt information + And the corresponding status prompt information @network_slice_booking_assignSlice_02_invalid_argument_scenario Scenario: Error response for invalid argument in request body @@ -75,7 +75,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_assignSlice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id @@ -86,7 +86,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response property "$.status" is 404 And the response property "$.code" is "NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_assignSlice_07_business_resource_not_found_scenario Scenario: Error response for not found bussiness resouce Given an correct format and not existing network slice id @@ -97,7 +97,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response property "$.status" is 404 And the response property "$.code" is "IDENTIFIER_NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_assignSlice_08_service_not_applicable_scenario Scenario: Common validations for fail scenario of area not supported Given the correct slice id is not supported by the service @@ -108,7 +108,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response property "$.status" is 422 And the response property "$.code" is "SERVICE_NOT_APPLICABLE" And the response property "$.message" is "The service is not available for the provided identifier." - + @network_slice_booking_assignSlice_09_inapposite_identifier_scenario Scenario: Common validations for fail scenario of inapposite identifier Given inapposite identifier or identifier is lost diff --git a/code/Test_definitions/network-slice-assignment-get.feature b/code/Test_definitions/network-slice-assignment-get.feature index 6c37907..589d029 100644 --- a/code/Test_definitions/network-slice-assignment-get.feature +++ b/code/Test_definitions/network-slice-assignment-get.feature @@ -1,12 +1,12 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get # Get information about devices assigned to an existing network slice. - + # Input to be provided by the implementation to the tester # # Implementation indications: # * apiRoot: API root of the server URL - + # Input to be provided by the implementation to the tester # # Implementation indications: @@ -35,7 +35,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" And the response property "$.sliceId" is a character string - And the response property "$.deviceList" is an array format that stores device information under slices + And the response property "$.deviceList" is an array format that stores device information under slices And the response property "$.sliceInfo" is a json format that stores the configuration information of slice resources @network_slice_booking_getDevice_02_invalid_argument_scenario @@ -82,7 +82,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_getDevice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id @@ -93,7 +93,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response property "$.status" is 404 And the response property "$.code" is "NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_getDevice_07_business_resource_not_found_scenario Scenario: Error response for not found bussiness resouce Given an correct format and not existing network slice id @@ -104,7 +104,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response property "$.status" is 404 And the response property "$.code" is "IDENTIFIER_NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_getDevice_08_service_not_applicable_scenario Scenario: Common validations for fail scenario of area not supported Given the correct slice id is not supported by the service @@ -115,7 +115,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response property "$.status" is 422 And the response property "$.code" is "SERVICE_NOT_APPLICABLE" And the response property "$.message" is "The service is not available for the provided identifier." - + @network_slice_booking_getDevice_09_inapposite_identifier_scenario Scenario: Common validations for fail scenario of inapposite identifier Given inapposite identifier or identifier is lost diff --git a/code/Test_definitions/network-slice-assignment-release.feature b/code/Test_definitions/network-slice-assignment-release.feature index 0f32553..1371cca 100644 --- a/code/Test_definitions/network-slice-assignment-release.feature +++ b/code/Test_definitions/network-slice-assignment-release.feature @@ -4,7 +4,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release # # Implementation indications: # * apiRoot: API root of the server URL - + # Testing assets: # * The AssignmentInfo of an existing Slice assignment # * The AssignmentInfo of an existing Slice assignment with status "AVAILABLE", and with provided values for "sink" and "sinkCredential" @@ -30,11 +30,10 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" And the response property "$.sliceId" is a character string - And the response property "$.device" exists only if provided in the request body and with the same value + And the response property "$.device" exists only if provided in the request body and with the same value And the response property "$.status" include in "SUCCESS" and "FAILURE" And the response property "$.statusInfo" contains a user friendly text - @network_slice_booking_releaseSlice_02_invalid_argument_scenario Scenario: Error response for invalid argument in request body Given the request body property argument is invalid, such as illegal character and format error @@ -79,7 +78,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_releaseSlice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id @@ -90,7 +89,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response property "$.status" is 404 And the response property "$.code" is "NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_releaseSlice_07_business_resource_not_found_scenario Scenario: Error response for not found bussiness resouce Given an correct format and not existing network slice id @@ -101,7 +100,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response property "$.status" is 404 And the response property "$.code" is "IDENTIFIER_NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_releaseSlice_08_service_not_applicable_scenario Scenario: Common validations for fail scenario of area not supported Given the correct slice id is not supported by the service @@ -112,7 +111,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response property "$.status" is 422 And the response property "$.code" is "SERVICE_NOT_APPLICABLE" And the response property "$.message" is "The service is not available for the provided identifier." - + @network_slice_booking_releaseSlice_09_inapposite_identifier_scenario Scenario: Common validations for fail scenario of inapposite identifier Given inapposite identifier or identifier is lost diff --git a/code/Test_definitions/network-slice-assignment-retrieve.feature b/code/Test_definitions/network-slice-assignment-retrieve.feature index cf857ca..78448c3 100644 --- a/code/Test_definitions/network-slice-assignment-retrieve.feature +++ b/code/Test_definitions/network-slice-assignment-retrieve.feature @@ -1,12 +1,12 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve # Retrieve the list of network slices to which a device is assigned. - + # Input to be provided by the implementation to the tester # # Implementation indications: # * apiRoot: API root of the server URL - + # Input to be provided by the implementation to the tester # # Implementation indications: @@ -80,7 +80,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_retrieveSlice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id @@ -91,7 +91,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve And the response property "$.status" is 404 And the response property "$.code" is "NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_retrieveSlice_07_business_resource_not_found_scenario Scenario: Error response for not found bussiness resouce Given an correct format and not existing network slice id @@ -102,7 +102,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve And the response property "$.status" is 404 And the response property "$.code" is "IDENTIFIER_NOT_FOUND" And the response property "$.message" contains a user friendly text - + @network_slice_booking_retrieveSlice_08_service_not_applicable_scenario Scenario: Common validations for fail scenario of area not supported Given the correct slice id is not supported by the service @@ -113,7 +113,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve And the response property "$.status" is 422 And the response property "$.code" is "SERVICE_NOT_APPLICABLE" And the response property "$.message" is "The service is not available for the provided identifier." - + @network_slice_booking_retrieveSlice_09_inapposite_identifier_scenario Scenario: Common validations for fail scenario of inapposite identifier Given inapposite identifier or identifier is lost From a2cf573802e44ec1e9a709a3ae9fe9b703ec465f Mon Sep 17 00:00:00 2001 From: XunliYang Date: Tue, 25 Nov 2025 15:13:06 +0800 Subject: [PATCH 13/13] Modify the meglinter error --- code/API_definitions/network-slice-assignment.yaml | 6 ++++-- code/API_definitions/network-slice-booking.yaml | 2 +- .../network-slice-assignment-assign.feature | 4 ++-- code/Test_definitions/network-slice-assignment-get.feature | 4 ++-- .../network-slice-assignment-release.feature | 2 +- .../network-slice-assignment-retrieve.feature | 2 +- 6 files changed, 11 insertions(+), 9 deletions(-) diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml index ff2e39f..eecb376 100644 --- a/code/API_definitions/network-slice-assignment.yaml +++ b/code/API_definitions/network-slice-assignment.yaml @@ -98,7 +98,7 @@ paths: ASSIGN_DEVICE_INPUT_ALL: $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_ALL" ASSIGN_DEVICE_INPUT_NUMBER: - $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" + $ref: "#/components/examples/ASSIGN_DEVICE_INPUT_NUMBER" required: true callbacks: networkSliceAssignmentSinkCallback: @@ -1400,6 +1400,7 @@ components: value: device: phoneNumber: "+123456789" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" RELEASE_DEVICE_INPUT_ALL: summary: Release device - All Identifiers description: Example of request to assign a device to a network slice using all identifiers @@ -1411,6 +1412,7 @@ components: publicAddress: "84.125.93.10" publicPort: 59765 ipv6Address: "2001:db8:85a3:8d3:1319:8a2e:370:7344" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" RELEASE_DEVICE_SUCCESSFUL: summary: Release Successful description: Example of successful response for releasing a device from a network slice request @@ -1451,7 +1453,6 @@ components: summary: Get Devices Successful description: Example of successful response for getting devices assigned to a network slice request value: - sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" deviceList: - device: phoneNumber: "+123456789" @@ -1481,6 +1482,7 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" RETRIEVE_INPUT_PHONENUMBER: summary: Retrieve Slice Info - Phone Number Identifier description: Example of request to retrieve network slice info using phone number identifier diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index a196c52..d0a5b82 100644 --- a/code/API_definitions/network-slice-booking.yaml +++ b/code/API_definitions/network-slice-booking.yaml @@ -1064,7 +1064,7 @@ components: id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" source: "https://notificationSendServer12.example.com" specversion: "1.0" - type: "org.camaraproject.network-slice-booking.v1.slice-created" + type: "org.camaraproject.network-slice-booking.v0.status-changed" datacontenttype: "application/json" time: "2024-06-01T12:00:00Z" data: diff --git a/code/Test_definitions/network-slice-assignment-assign.feature b/code/Test_definitions/network-slice-assignment-assign.feature index 88c7369..a31163f 100644 --- a/code/Test_definitions/network-slice-assignment-assign.feature +++ b/code/Test_definitions/network-slice-assignment-assign.feature @@ -27,9 +27,9 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation assign And the response header "x-correlator" has same value as the request header "x-correlator" And the response body complies with the OAS schema at "/components/schemas/AssignmentInfo" And the response property "$.sliceId" is a character string - And the response property "$.device" exists only if provided in the request body and with the same value + And the response property "$.device" exists only if provided in the request body and with the same value And the assigned status include in "SUCCESS" and "FAILURE" - And the corresponding status prompt information + And the corresponding status prompt information @network_slice_booking_assignSlice_02_invalid_argument_scenario Scenario: Error response for invalid argument in request body diff --git a/code/Test_definitions/network-slice-assignment-get.feature b/code/Test_definitions/network-slice-assignment-get.feature index 589d029..7d91c9c 100644 --- a/code/Test_definitions/network-slice-assignment-get.feature +++ b/code/Test_definitions/network-slice-assignment-get.feature @@ -35,7 +35,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" And the response property "$.sliceId" is a character string - And the response property "$.deviceList" is an array format that stores device information under slices + And the response property "$.deviceList" is an array format that stores device information under slices And the response property "$.sliceInfo" is a json format that stores the configuration information of slice resources @network_slice_booking_getDevice_02_invalid_argument_scenario @@ -82,7 +82,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation get And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_getDevice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id diff --git a/code/Test_definitions/network-slice-assignment-release.feature b/code/Test_definitions/network-slice-assignment-release.feature index 1371cca..6fb50cf 100644 --- a/code/Test_definitions/network-slice-assignment-release.feature +++ b/code/Test_definitions/network-slice-assignment-release.feature @@ -30,7 +30,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation release And the response header "Content-Type" is "application/json" And the response header "x-correlator" has same value as the request header "x-correlator" And the response property "$.sliceId" is a character string - And the response property "$.device" exists only if provided in the request body and with the same value + And the response property "$.device" exists only if provided in the request body and with the same value And the response property "$.status" include in "SUCCESS" and "FAILURE" And the response property "$.statusInfo" contains a user friendly text diff --git a/code/Test_definitions/network-slice-assignment-retrieve.feature b/code/Test_definitions/network-slice-assignment-retrieve.feature index 78448c3..bd14801 100644 --- a/code/Test_definitions/network-slice-assignment-retrieve.feature +++ b/code/Test_definitions/network-slice-assignment-retrieve.feature @@ -80,7 +80,7 @@ Feature: CAMARA Network Slice Assignment API v0.1.0 - Operation retrieve And the response property "$.status" is 403 And the response property "$.code" is "PERMISSION_DENIED" And the response property "$.message" contains a user friendly text - + @network_slice_booking_retrieveSlice_06_server_resource_not_found_scenario Scenario: Error response for not found server resouce Given an correct format and existing network slice id