diff --git a/code/API_definitions/network-slice-assignment.yaml b/code/API_definitions/network-slice-assignment.yaml new file mode 100644 index 0000000..eecb376 --- /dev/null +++ b/code/API_definitions/network-slice-assignment.yaml @@ -0,0 +1,1520 @@ +openapi: 3.0.3 +info: + title: Network Slice Assignment + description: | + 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 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 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 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. + * **sliceId**: A unique identifier for a network slice, obtained from the createSlice 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. + + # 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`. + + 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: + /slices/devices/assign: + post: + tags: + - Network Slice Assignment + summary: Assign a device to a network slice + description: | + 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 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. + - 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: + - $ref: "#/components/parameters/x-correlator" + requestBody: + description: Parameters to assign a device to a network slice + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceInput" + examples: + 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: + "{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" + ASSIGNMENT_DEVICE_EXCEED_EVENT: + $ref: "#/components/examples/ASSIGNMENT_DEVICE_EXCEED_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: The result of the device assignment operation + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceAssignmentInfo" + examples: + 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" + 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": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" + "422": + $ref: "#/components/responses/Generic422" + "429": + $ref: "#/components/responses/Generic429" + + /slices/devices/release: + post: + tags: + - Network Slice Assignment + 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`. + - 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 + - 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: + - $ref: "#/components/parameters/x-correlator" + requestBody: + description: Parameters to release a device from a network slice + content: + application/json: + 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 + responses: + "200": + description: The result of the device release operation + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/DeviceReleaseInfo" + 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": + $ref: "#/components/responses/Generic401" + "403": + $ref: "#/components/responses/Generic403" + "404": + $ref: "#/components/responses/Generic404" + "422": + $ref: "#/components/responses/Generic422" + "429": + $ref: "#/components/responses/Generic429" + + /slices/devices/get/{sliceId}: + get: + tags: + - Network Slice Assignment + summary: Get devices assigned to a network slice + description: | + Get information about devices assigned to an existing network slice. + operationId: getDevices + security: + - openId: + - network-slice-assignment:devices:get + parameters: + - name: sliceId + in: path + description: Slice ID that was obtained from the createSlice operation + required: true + schema: + $ref: "#/components/schemas/SliceId" + - $ref: "#/components/parameters/x-correlator" + responses: + "200": + description: Contains information about active slice + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/SliceDevice" + 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" + + /slices/devices/retrieve: + post: + tags: + - Network Slice Assignment + summary: Retrieve all network slices corresponds to a device + description: | + 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 slices 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 slices the device is assigned + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/RetrievedSlicesOutput" + examples: + RETRIEVE_SUCCESSFUL: + $ref: "#/components/examples/RETRIEVE_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" +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" + SliceId: + description: Slice ID in UUID format + type: string + format: uuid + DeviceInput: + 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: + $ref: "#/components/schemas/Device" + sliceId: + $ref: "#/components/schemas/SliceId" + 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: + - 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 a device from a slice + type: object + properties: + device: + $ref: "#/components/schemas/Device" + sliceId: + $ref: "#/components/schemas/SliceId" + required: + - 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: + device: + $ref: "#/components/schemas/DeviceResponse" + sliceId: + $ref: "#/components/schemas/SliceId" + status: + $ref: "#/components/schemas/AssignmentStatus" + statusInfo: + $ref: "#/components/schemas/AssignmentStatusInfo" + required: + - sliceId + - status + AssignmentStatus: + description: | + Status of the device assignment operation + * `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: + - SUCCESS + - FAILURE + - PENDING + AssignmentStatusInfo: + 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 slice + * `DEVICE_ALREADY_ASSIGNED` - Device is already assigned to the slice + * `SLICE_NOT_FOUND` - The specified sliceId does not exist + * `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_UNKNOWN_ERROR + - VALIDATION_PENDING + 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 + * `SLICE_NOT_FOUND` - The specified sliceId does not exist + * `RELEASE_UNKNOWN_ERROR` - The release operation failed due to an unknown error + type: string + enum: + - RELEASE_COMPLETED + - DEVICE_ALREADY_RELEASED + - SLICE_NOT_FOUND + - RELEASE_UNKNOWN_ERROR + RetrievedSlicesOutput: + description: Response containing slices assigned to a device + type: object + properties: + sliceList: + type: array + items: + $ref: "#/components/schemas/SliceInfo" + minItems: 0 + + SliceDevice: + description: Information about devices assigned to a slice + type: object + properties: + deviceList: + type: array + items: + $ref: "#/components/schemas/Device" + minItems: 0 + sliceInfo: + $ref: "#/components/schemas/SliceInfo" + required: + - deviceList + - sliceInfo + SliceInfo: + description: Slice related information. + allOf: + - $ref: "#/components/schemas/CreateSlice" + - type: object + properties: + sliceId: + $ref: "#/components/schemas/SliceId" + required: + - sliceId + CreateSlice: + description: Attributes required to create a slice + 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-assignment.v0.status-changed" + 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-assignment.v0.status-changed: "#/components/schemas/AssignmentDeviceEvent" + + AssignmentDeviceEvent: + description: Event to notify about device assignment status change + allOf: + - $ref: "#/components/schemas/CloudEvent" + - type: object + properties: + data: + description: Event details depending on the event type + allOf: + - $ref: "#/components/schemas/DeviceAssignmentInfo" + 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: Resource is not found + 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 slice 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: + 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" + specversion: "1.0" + type: "org.camaraproject.network-slice-assignment.v0.status-changed" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED" + 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: + id: "83a0d986-0866-4f38-b8c0-fc65bfcda452" + source: "https://notificationSendServer12.example.com" + specversion: "1.0" + type: "org.camaraproject.network-slice-assignment.v0.status-changed" + datacontenttype: "application/json" + time: "2024-06-01T12:00:00Z" + data: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + 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 + value: + device: + phoneNumber: "+123456789" + 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_SUCCESSFUL: + summary: Assignment Successful + description: Example of successful response for assigning a device to a network slice request + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "SUCCESS" + statusInfo: "ASSIGNMENT_COMPLETED" + ASSIGN_DEVICE_FAILURE_EXCEEDED: + summary: Assignment Failure for DeviceNum Exceeded + description: Example of failure response for assigning a device to a network slice request due to maximum devices exceeded + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + phoneNumber: "+123456789" + status: "FAILURE" + statusInfo: "MAX_DEVICES_EXCEEDED" + ASSIGN_DEVICE_ALREADY_ASSIGNED: + summary: Assignment Failure for Device Already Assigned + description: Example of failure response for assigning a device to a network slice request due to device already assigned + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + 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 + 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 + 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" + RELEASE_DEVICE_SUCCESSFUL: + summary: Release Successful + description: Example of successful response for releasing a device from a network slice request + value: + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + device: + 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 + value: + deviceList: + - device: + phoneNumber: "+123456789" + - device: + phoneNumber: "+987654321" + 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 + 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 + 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 + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" diff --git a/code/API_definitions/network-slice-booking.yaml b/code/API_definitions/network-slice-booking.yaml index 083e534..d0a5b82 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 @@ -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`. @@ -56,49 +58,87 @@ 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" 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: + 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 + 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 + 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" @@ -115,33 +155,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" @@ -158,36 +198,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" @@ -231,23 +271,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: @@ -268,6 +308,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 +539,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.v0.status-changed" + 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.v0.status-changed: "#/components/schemas/SliceCreatedEvent" + + SliceCreatedEvent: + description: Event to notify a slice creation status change + allOf: + - $ref: "#/components/schemas/CloudEvent" + - type: object + properties: + data: + description: Event details depending on the event type + allOf: + - $ref: "#/components/schemas/SliceInfo" + 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 @@ -594,11 +825,36 @@ 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 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: @@ -623,7 +879,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: @@ -738,7 +994,7 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" RESPONSE_POLYGON: value: serviceTime: @@ -769,4 +1025,75 @@ components: upStreamDelayBudget: value: 12 unit: Milliseconds - sessionId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" + 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.v0.status-changed" + 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 + 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.v0.status-changed" + 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 + sliceId: "3fa85f64-5717-4562-b3fc-2c963f66afa6" 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..a31163f --- /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..7d91c9c --- /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..6fb50cf --- /dev/null +++ b/code/Test_definitions/network-slice-assignment-release.feature @@ -0,0 +1,146 @@ +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..bd14801 --- /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." 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" 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