diff --git a/CODEOWNERS b/CODEOWNERS index 740c0434d8..d81c55ba36 100644 --- a/CODEOWNERS +++ b/CODEOWNERS @@ -5,7 +5,7 @@ # For more details, read the following article on GitHub: https://help.github.com/articles/about-codeowners/. # These are the default owners for the whole content of this repository. The default owners are automatically added as reviewers when you open a pull request, unless different owners are specified in the file. -* @hdamker @eric-murray @RandyLevensalor +* @hdamker @eric-murray @RandyLevensalor @jlurien # Owners of the CODEOWNER and Maintainer.md files are the admins of CAMARA (to allow them to keep the teams within the CAMARA organization in sync in case of changes) /CODEOWNERS @camaraproject/admins diff --git a/README.md b/README.md index 3bc6caacc3..664e434075 100644 --- a/README.md +++ b/README.md @@ -16,15 +16,15 @@ Repository to describe, develop, document and test the QualityOnDemand API famil * set quality for a flow within an access network connections (e.g. mobile device connection or fixed access between a home gateway and the service providers gateway router) * Session mode, for a specific duration * Provision mode, indefinitely for each time the device connects to the same access network - * get notification if network cannot fulfill -* Describe, develop, document and test the APIs (with 1-2 Service Providers) + * get notification if the network cannot fulfill +* Describe, develop, document and test the APIs (with 1–2 Service Providers) * Started: October 2021 * Location: virtually ## Meetings * Meetings are held virtually: [Meeting registration / Join](https://zoom-lfx.platform.linuxfoundation.org/meeting/94112812156?password=f238d6af-c959-48d7-a862-abdb3c648e40) -* Schedule: bi-weekly, Friday, 2 PM CET/CEST (13:00 UTC, 12:00 UTC during European DST). For date/time of next meeting see previous [meeting minutes](https://wiki.camaraproject.org/display/CAM/Quality+on+Demand+Meeting+Minutes). +* Schedule: bi-weekly, Friday, 2 PM CET/CEST (13:00 UTC, 12:00 UTC during European DST). For date/time of the next meeting, see previous [meeting minutes](https://wiki.camaraproject.org/x/0AOeAQ). ## Status and released versions @@ -36,7 +36,7 @@ Repository to describe, develop, document and test the QualityOnDemand API famil - [View it on Swagger Editor](https://editor.swagger.io/?url=https://raw.githubusercontent.com/camaraproject/QualityOnDemand/release-0.10.1/code/API_definitions/qod-api.yaml) - OpenAPI [YAML spec file](https://github.com/camaraproject/QualityOnDemand/blob/release-0.10.1/code/API_definitions/qod-api.yaml) -* The previous released version v0.9.0 is availabe within the [release-0.9.0 branch](https://github.com/camaraproject/QualityOnDemand/tree/release-0.9.0) +* The previous released version v0.9.0 is available within the [release-0.9.0 branch](https://github.com/camaraproject/QualityOnDemand/tree/release-0.9.0) * For changes between v0.10.0 and v0.9.0 see the [CHANGELOG.md](https://github.com/camaraproject/QualityOnDemand/blob/main/CHANGELOG.md) * Provider implementations (PI) are available within separate repositories (partly for previous releases): @@ -47,5 +47,5 @@ Repository to describe, develop, document and test the QualityOnDemand API famil ## Contributorship and mailing list -* To subscribe / unsubscribe to the mailing list of this Sub Project and thus be / resign as Contributor please visit . +* To subscribe / unsubscribe to the mailing list of this Sub Project and thus be / resign as Contributor, please visit . * A message to all Contributors of this Sub Project can be sent using . diff --git a/code/API_definitions/qos-profiles.yaml b/code/API_definitions/qos-profiles.yaml index 091b9d3b73..6804c7c5d4 100644 --- a/code/API_definitions/qos-profiles.yaml +++ b/code/API_definitions/qos-profiles.yaml @@ -16,30 +16,37 @@ info: How QoS profiles are mapped to connectivity characteristics are subject to agreements between the communication service provider and the API invoker. Within the CAMARA project, you can find a sample for such a mapping of QoS profiles. [CAMARA QoS Profiles Mapping Table (REFERENCE DRAFT)](https://github.com/camaraproject/QualityOnDemand/blob/main/documentation/API_documentation/QoSProfile_Mapping_Table.md) + # Authorization and Authentication + + [Camara Security and Interoperability Profile](https://github.com/camaraproject/IdentityAndConsentManagement/blob/main/documentation/CAMARA-Security-Interoperability.md) provides details on how a client requests an access token. + + Which specific authorization flows are to be used will be determined during onboarding process, happening between the API Client and the Telco Operator exposing the API, taking into account the declared purpose for accessing the API, while also being subject to the prevailing legal framework dictated by local legislation. + + It is important to remark that in cases where personal user 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 3-legged access tokens becomes mandatory. This measure ensures that the API remains in strict compliance with user privacy preferences and regulatory obligations, upholding the principles of transparency and user-centric data control. + # Further info and support (FAQs will be added in a later version of the documentation) - termsOfService: http://swagger.io/terms/ - contact: - email: project-email@sample.com license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html version: wip + externalDocs: description: Product documentation at Camara url: https://github.com/camaraproject/ -security: - - oAuth2ClientCredentials: [] + servers: - url: "{apiRoot}/qos-profiles/vwip" variables: apiRoot: default: http://localhost:9091 description: API root, defined by the service provider, e.g. `api.example.com` or `api.example.com/somepath` + tags: - name: QoS Profiles description: Manage QoS Profiles + paths: /qos-profiles: get: @@ -47,9 +54,14 @@ paths: - QoS Profiles summary: "Get All QoS Profiles" description: | - Returns all QoS Profiles that match the given criteria. - If no criteria is given, all QoS Profiles are returned. + Returns all QoS Profiles that match the given criteria, or all profiles if no criteria is specified. + + The access token may be either a 2-legged or 3-legged access token. If the access token is 3-legged, all returned QoS Profiles must be available to all end users associated with the access token. + operationId: getQosProfiles + security: + - openId: + - qos-profiles:qos-profiles:read parameters: - name: name in: query @@ -95,6 +107,12 @@ paths: operationId: getQosProfile description: | Returns a QoS Profile that matches the given name. + + The access token may be either a 2-legged or 3-legged access token. If the access token is 3-legged, a QoS Profile is only returned if available to all end users associated with the access token. + + security: + - openId: + - qos-profiles:qos-profiles:read parameters: - name: name in: path @@ -128,14 +146,9 @@ paths: components: securitySchemes: - oAuth2ClientCredentials: - description: | - The QoS Profiles API makes use of the OAUTH 2.0 client credentials grant which is applicable for server to server use cases involving trusted partners or clients without any protected user data involved. In this method the API invoker client is registered as a confidential client with an authorization grant type of client_credentials - type: oauth2 - flows: - clientCredentials: - tokenUrl: https://api.example.com/oauth/token - scopes: {} + openId: + type: openIdConnect + openIdConnectUrl: https://example.com/.well-known/openid-configuration parameters: x-correlator: @@ -231,8 +244,7 @@ components: maxDuration: description: | The maximum time period that this profile can be deployed. - NOTE: currently the duration within `sessionInfo` is limited to 86400 seconds (1 day). - The value of `maxDuration` shouldn't therefore exceed this time period. The limitation might be removed in later versions. + Overall session duration must not exceed this value. This includes the initial requested duration plus any extensions. allOf: - $ref: "#/components/schemas/Duration" priority: diff --git a/code/API_definitions/quality-on-demand.yaml b/code/API_definitions/quality-on-demand.yaml index 5363730a65..d9b4718d42 100644 --- a/code/API_definitions/quality-on-demand.yaml +++ b/code/API_definitions/quality-on-demand.yaml @@ -12,7 +12,7 @@ info: ![QoD API Overview](https://raw.githubusercontent.com/camaraproject/QualityOnDemand/main/documentation/API_documentation/resources/QoD_latency_overview.PNG) - The usage of the API is based on QoS session resources, which can be created (based on available QoS profiles), queried and deleted. The deletion of a requested session can be triggered by the API consumer or can be triggered automatically. The automatic process is triggered either when the requested specified duration of a QoS session has reached its limit or the default session expiration time has been reached (within an example provider implementation it is set to 24hrs). + The usage of the API is based on QoS session resources, which can be created (based on available QoS profiles), queried and deleted. The deletion of a requested session can be triggered by the API consumer or can be triggered automatically once the QoS session has reached its limit. # Relevant terms and definitions @@ -26,7 +26,7 @@ info: Latency, throughput or priority requirements of the application mapped to relevant QoS profile values. The set of QoS Profiles that an operator is offering can be retrieved by means of the [QoS Profile API](link TBC). * **Identifier for the device**: - At least one identifier for the device (user equipment) out of four options: IPv4 address, IPv6 address, Phone number, or Network Access Identifier [[5]](#5) assigned by the mobile network operator for the device. + At least one identifier for the device (user equipment) out of four options: IPv4 address, IPv6 address, Phone number, or Network Access Identifier assigned by the mobile network operator for the device. Note: Network Access Identifier is defined for future use and will not be supported with v0.11.0 of the API. * **Identifier for the application server**: IPv4 and/or IPv6 address of the application server (application backend) @@ -35,7 +35,7 @@ info: The precise application data flow the developer wants to prioritize and have stable latency or throughput for. This flow is in the current API version determined by the identifiers used for the device and the application server. And it can be further elaborated with details such as ports or port-ranges. Future version of the API might allow more detailed flow identification features. * **Duration**: - Duration (in seconds) for which the QoS session (between application client and application server) should be created. This parameter is optional. When not specified, a default session duration (e.g. 24 hours) is applied. The user may request a termination before its expiration. + Duration (in seconds) for which the QoS session (between application client and application server) should be created. Limits for session duration can be set by the implementation for the QoS profile. The user may request a termination before its expiration. * **Notification URL and token**: Developers may provide a callback URL on which notifications about all status change events of the session (eg. session termination) can be received from the service provider. This is an optional parameter. @@ -55,30 +55,37 @@ info: ![QoD Management API](https://raw.githubusercontent.com/camaraproject/QualityOnDemand/main/documentation/API_documentation/resources/QoD_details.PNG) + # Authorization and Authentication + + [Camara Security and Interoperability Profile](https://github.com/camaraproject/IdentityAndConsentManagement/blob/main/documentation/CAMARA-Security-Interoperability.md) provides details on how a client requests an access token. + + Which specific authorization flows are to be used will be determined during onboarding process, happening between the API Client and the Telco Operator exposing the API, taking into account the declared purpose for accessing the API, while also being subject to the prevailing legal framework dictated by local legislation. + + It is important to remark that in cases where personal user 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 3-legged access tokens becomes mandatory. This measure ensures that the API remains in strict compliance with user privacy preferences and regulatory obligations, upholding the principles of transparency and user-centric data control. + # Further info and support (FAQs will be added in a later version of the documentation) - termsOfService: http://swagger.io/terms/ - contact: - email: project-email@sample.com license: name: Apache 2.0 url: https://www.apache.org/licenses/LICENSE-2.0.html version: wip + externalDocs: description: Product documentation at Camara url: https://github.com/camaraproject/ -security: - - oAuth2ClientCredentials: [] + servers: - url: "{apiRoot}/quality-on-demand/vwip" variables: apiRoot: default: http://localhost:9091 description: API root, defined by the service provider, e.g. `api.example.com` or `api.example.com/somepath` + tags: - name: QoS Sessions description: Manage QoS sessions + paths: /sessions: post: @@ -97,13 +104,16 @@ paths: A `QOS_STATUS_CHANGED` event notification with `qosStatus` as `UNAVAILABLE` will also be send if the network terminates the session before the requested duration expired - NOTE: in case of a `QOS_STATUS_CHANGED` event with `qosStatus` as `UNAVAILABLE` and `statusInfo` as `NETWORK_TERMINATED` the resources of the QoS session - are not directly released, but will get deleted automatically at earliest 360 seconds after the event. - This behavior allows clients which are not receiving notification events but are polling to get the session information with - the `qosStatus` `UNAVAILABLE` and `statusInfo` `NETWORK_TERMINATED`. Before a client can attempt to create a new QoD session - for the same device and flow period they must release the session resources with an explicit `delete` operation if not yet automatically deleted. + **NOTES:** + - In case of a `QOS_STATUS_CHANGED` event with `qosStatus` as `UNAVAILABLE` and `statusInfo` as `NETWORK_TERMINATED` the resources of the QoS session are not directly released, but will get deleted automatically at earliest 360 seconds after the event. + + This behavior allows clients which are not receiving notification events but are polling to get the session information with the `qosStatus` `UNAVAILABLE` and `statusInfo` `NETWORK_TERMINATED`. Before a client can attempt to create a new QoD session for the same device and flow period they must release the session resources with an explicit `delete` operation if not yet automatically deleted. + - The access token may be either 2-legged or 3-legged. If a 3-legged access token is used, the end user identified by the `device` parameter must also be associated with the access token. operationId: createSession + security: + - openId: + - quality-on-demand:sessions:create parameters: - $ref: "#/components/parameters/x-correlator" requestBody: @@ -240,36 +250,31 @@ paths: "403": $ref: "#/components/responses/Generic403" "409": - description: Conflict - headers: - x-correlator: - $ref: '#/components/headers/x-correlator' - content: - application/json: - schema: - $ref: "#/components/schemas/ErrorInfo" - example: - status: 409 - code: CONFLICT - message: "Another session is created for the same device" + $ref: "#/components/responses/SessionInConflict409" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "501": $ref: "#/components/responses/Generic501" "503": $ref: "#/components/responses/Generic503" - security: - - oAuth2ClientCredentials: [] - - threeLegged: - - "qod-sessions-write" /sessions/{sessionId}: get: tags: - QoS Sessions summary: Get QoS session information - description: Querying for QoS session resource information details + description: | + Querying for QoS session resource information details + + **NOTES:** + - The access token may be either 2-legged or 3-legged. If a 3-legged access token is used, the end user associated with the session must also be associated with the access token. + operationId: getSession + security: + - openId: + - quality-on-demand:sessions:read parameters: - name: sessionId in: path @@ -301,14 +306,12 @@ paths: $ref: "#/components/responses/Generic403" "404": $ref: "#/components/responses/SessionNotFound404" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - oAuth2ClientCredentials: [] - - threeLegged: - - "qod-sessions-read" delete: tags: @@ -321,7 +324,14 @@ paths: - `qosStatus` as `UNAVAILABLE` and - `statusInfo` as `DELETE_REQUESTED` There will be no notification event if the `qosStatus` was already `UNAVAILABLE`. + + **NOTES:** + - The access token may be either 2-legged or 3-legged. If a 3-legged access token is used, the end user associated with the session must also be associated with the access token. + operationId: deleteSession + security: + - openId: + - quality-on-demand:sessions:delete parameters: - name: sessionId in: path @@ -344,14 +354,12 @@ paths: $ref: "#/components/responses/Generic403" "404": $ref: "#/components/responses/SessionNotFound404" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - oAuth2ClientCredentials: [] - - threeLegged: - - "qod-sessions-delete" /sessions/{sessionId}/extend: post: @@ -359,15 +367,20 @@ paths: - QoS Sessions summary: "Extend the duration of an active session" description: | - Extend the overall duration of an active QoS session. If this operation is executed successfully, the new duration of the target session will be the original duration plus the additionally requested duration. - The new remaining duration of the QoS session shall not exceed the maximum remaining duration limit (currently fixed at 86,400 seconds) where the remaining duration is calculated as the difference between the `expiresAt` and current time when the request to extend the session duration is received. If this maximum limit would be exceeded, the overall duration shall be set such that the remaining duration is equal to this limit. - An example: A QoD session was originally created with duration 80,000 seconds. 10,000 seconds later, the developer requested to extend the session by 20,000 seconds. - - Original duration: 80,000 seconds - - Elapsed time: 10,000 seconds - - Remaining duration: 70,000 seconds - - New remaining duration: 86,400 seconds (the maximum allowed) - - New overall session duration: 96,400 seconds + Extend the overall session duration of an active QoS session. + The overall duration of the QoS session, including the additional extended duration, shall not exceed the maximum duration limit fixed for the QoS Profile. If the current duration plus the value of `requestedAdditionalDuration` exceeds the maximum limit, the new overall duration shall be capped to the maximum value allowed. + An example: For a QoS profile limited to a `maxDuration` of 50,000 seconds, a QoD session was originally created with duration 30,000 seconds. Before the session expires, the developer requests to extend the session by another 30,000 seconds: + - Previous duration: 30,000 seconds + - Requested additional duration: 30,000 seconds + - New overall session duration: 50,000 seconds (the maximum allowed) + + **NOTES:** + - The access token may be either 2-legged or 3-legged. If a 3-legged access token is used, the end user associated with the session must also be associated with the access token. + operationId: extendQosSessionDuration + security: + - openId: + - quality-on-demand:sessions:update parameters: - name: sessionId in: path @@ -421,42 +434,23 @@ paths: $ref: "#/components/responses/Generic403" "404": $ref: "#/components/responses/SessionNotFound404" + "429": + $ref: "#/components/responses/Generic429" "500": $ref: "#/components/responses/Generic500" "503": $ref: "#/components/responses/Generic503" - security: - - oAuth2ClientCredentials: [] - - threeLegged: - - "qod-sessions-write" components: securitySchemes: - oAuth2ClientCredentials: - description: | - The QoD API makes use of the OAUTH 2.0 client credentials grant which is applicable for server to server use cases involving trusted partners or clients without any protected user data involved. In this method the API invoker client is registered as a confidential client with an authorization grant type of client_credentials - type: oauth2 - flows: - clientCredentials: - tokenUrl: https://api.example.com/oauth/token - scopes: {} + openId: + type: openIdConnect + openIdConnectUrl: https://example.com/.well-known/openid-configuration notificationsBearerAuth: description: Bearer authentication for notifications type: http scheme: bearer bearerFormat: "{$request.body#/webhook/notificationAuthToken}" - threeLegged: - type: oauth2 - description: This API uses OAuth 2 with the authorization code grant flow. - flows: - authorizationCode: - authorizationUrl: https://api.example.com/oauth2/authorize - tokenUrl: https://api.example.com/oauth/token - scopes: - qod-sessions-read: Retrieval of QoS sessions - qod-sessions-write: Creation and update of QoS sessions - qod-sessions-delete: Deletion of QoS sessions - qod-profiles-read: Retrieval of QoS profiles parameters: x-correlator: @@ -527,33 +521,37 @@ components: sessionId: $ref: "#/components/schemas/SessionId" duration: + description: | + Session duration in seconds. Implementations can grant the requested session duration or set a different duration, based on network policies or conditions. + - When `qosStatus` is "REQUESTED", the value is the duration to be scheduled, granted by the implementation. + - When `qosStatus` is AVAILABLE", the value is the overall duration since `startedAt. When the session is extended, the value is the new overall duration of the session. + - When `qosStatus` is "UNAVAILABLE", the value is the overall effective duration since `startedAt` until the session was terminated. type: integer format: int32 minimum: 1 - example: 86400 + example: 3600 startedAt: - type: integer - example: 1639479600 - description: Timestamp of session start in seconds since Unix epoch - format: int64 + description: Date and time when the QoS status became "AVAILABLE". Not to be returned when `qosStatus` is "REQUESTED". Format must follow RFC 3339 and must indicate time zone (UTC or local). + type: string + format: date-time + example: "2024-06-01T12:00:00Z" expiresAt: - type: integer - example: 1639566000 - description: Timestamp of session expiration if the session was not deleted, in seconds since Unix epoch - format: int64 + description: | + Date and time of the QoS session expiration. Format must follow RFC 3339 and must indicate time zone (UTC or local). + - When `qosStatus` is "AVAILABLE", it is the limit time when the session is scheduled to finnish, if not terminated by other means. + - When `qosStatus` is "UNAVAILABLE", it is the time when the session was terminated. + - Not to be returned when `qosStatus` is "REQUESTED". + When the session is extended, the value is the new expiration time of the session. + type: string + format: date-time + example: "2024-06-01T13:00:00Z" qosStatus: $ref: "#/components/schemas/QosStatus" statusInfo: $ref: "#/components/schemas/StatusInfo" - messages: - type: array - items: - $ref: "#/components/schemas/Message" required: - sessionId - duration - - startedAt - - expiresAt - qosStatus CreateSession: @@ -564,17 +562,13 @@ components: properties: duration: description: | - Session duration in seconds. Maximal value of 24 hours is used if not set. - After session is expired the, client will receive a `QOS_STATUS_CHANGED` event with - - `qosStatus` as `UNAVAILABLE`, and, - - `statusInfo` as `DURATION_EXPIRED`. - See notification callback. + Requested session duration in seconds. Value may be explicitly limited for the QoS profile, as specified in the [Qos Profile API](TBC). Implementations can grant the requested session duration or set a different duration, based on network policies or conditions. type: integer format: int32 minimum: 1 - maximum: 86400 - default: 86400 - example: 86400 + example: 3600 + required: + - duration Port: description: TCP or UDP port number @@ -621,12 +615,11 @@ components: properties: requestedAdditionalDuration: description: | - Additional duration in seconds to be extended. + Additional duration in seconds to be added to the current session duration. The overall session duration, including extensions, shall not exceed the maximum duration limit for the QoS Profile. type: integer format: int32 minimum: 1 - maximum: 86399 - example: 60 + example: 1800 required: - requestedAdditionalDuration @@ -771,10 +764,10 @@ components: example: "123456789@domain.com" 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, optionally prefixed with '+'. + 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: '^\+?[0-9]{5,15}$' - example: "123456789" + pattern: '^\+[1-9][0-9]{4,14}$' + example: "+123456789" DeviceIpv4Addr: type: object @@ -838,21 +831,6 @@ components: - 2001:db8:85a3:8d3::0/64 - 2001:db8:85a3:8d3::/64 - Message: - description: Message with additional information - type: object - properties: - severity: - description: Message severity - type: string - enum: ["INFO", "WARNING"] - description: - description: Detailed message text - type: string - required: - - severity - - description - QosStatus: description: | The current status of the requested QoS session. The status can be one of the following: @@ -950,6 +928,43 @@ components: code: NOT_FOUND message: "Session Id does not exist" + SessionInConflict409: + description: Conflict + headers: + x-correlator: + $ref: '#/components/headers/x-correlator' + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + example: + status: 409 + code: CONFLICT + message: Conflict with an existing session for the same device. + + Generic429: + description: Too Many Requests + headers: + x-correlator: + $ref: "#/components/headers/x-correlator" + content: + application/json: + schema: + $ref: "#/components/schemas/ErrorInfo" + examples: + GENERIC_429_QUOTA_EXCEEDED: + description: Request is rejected due to exceeding a business quota limit + value: + status: 429 + code: QUOTA_EXCEEDED + message: Either out of resource quota or reaching rate limiting. + GENERIC_429_TOO_MANY_REQUESTS: + description: API Server request limit is overpassed + value: + status: 429 + code: TOO_MANY_REQUESTS + message: Either out of resource quota or reaching rate limiting. + Generic500: description: Internal server error headers: @@ -973,30 +988,37 @@ components: application/json: schema: $ref: "#/components/schemas/ErrorInfo" - example: - status: 501 - code: NOT_IMPLEMENTED - message: "Service not implemented for the specified user device" + examples: + GENERIC_501_NOT_IMPLEMENTED: + description: Service not implemented. The use of this code should be avoided as far as possible to get the objective to reach aligned implementations + value: + status: 501 + code: NOT_IMPLEMENTED + message: This functionality is not implemented yet. Generic503: - description: Service unavailable + description: Service Unavailable headers: x-correlator: - $ref: '#/components/headers/x-correlator' + $ref: "#/components/headers/x-correlator" content: application/json: schema: $ref: "#/components/schemas/ErrorInfo" - example: - status: 503 - code: UNAVAILABLE - message: "Service unavailable" + examples: + GENERIC_503_UNAVAILABLE: + description: Service is not available. Temporary situation usually related to maintenance process in the server side + value: + status: 503 + code: UNAVAILABLE + message: Service Unavailable. examples: SESSION_AVAILABLE_EXAMPLE: summary: QoS session status is available + description: QoS session info when status is available value: - duration: 86400 + duration: 3600 device: ipv4Address: publicAddress: 203.0.113.0 @@ -1007,14 +1029,15 @@ components: webhook: notificationUrl: https://application-server.com sessionId: 3fa85f64-5717-4562-b3fc-2c963f66afa6 - startedAt: 1639479600 - expiresAt: 1639566000 + startedAt: "2024-06-01T12:00:00Z" + expiresAt: "2024-06-01T13:00:00Z" qosStatus: AVAILABLE SESSION_UNAVAILABLE_EXAMPLE: summary: QoS session is unavailable + description: QoS session info when status is unavailable due to network termination value: - duration: 86400 + duration: 2428 device: ipv4Address: publicAddress: 203.0.113.0 @@ -1025,20 +1048,20 @@ components: webhook: notificationUrl: https://application-server.com sessionId: 3fa85f64-5717-4562-b3fc-2c963f66afa6 - startedAt: 1639479600 - expiresAt: 1639566000 + startedAt: "2024-06-01T12:00:00Z" + expiresAt: "2024-06-01T12:40:28Z" qosStatus: UNAVAILABLE statusInfo: NETWORK_TERMINATED QOS_STATUS_CHANGED_EXAMPLE: - description: QoS status changed - summary: Cloud event example for QoS status change to UNAVAILABLE due to DURATION_EXPIRED + summary: QoS status changed + description: Cloud event example for QoS status change to UNAVAILABLE due to DURATION_EXPIRED value: id: 83a0d986-0866-4f38-b8c0-fc65bfcda452 source: 'https://api.example.com/qod/v0/sessions/123e4567-e89b-12d3-a456-426614174000' specversion: '1.0' type: 'org.camaraproject.qod.v0.qos-status-changed' - time: '2021-12-12T00:00:00Z' + time: '2024-06-01T13:00:00Z' data: sessionId: '123e4567-e89b-12d3-a456-426614174000' qosStatus: 'UNAVAILABLE' diff --git a/code/cucumber/README.md b/code/cucumber/README.md deleted file mode 100644 index 29eda7cf12..0000000000 --- a/code/cucumber/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# QA - Tests - Quality on Demand - -## Prerequisites - -1. Ensure QoD App service is up and running on localhost on port 9091. -2. Ensure that scef/nef server is configured for being available on port 8081. - - -Command for starting service locally using jar file :- -Please check Readme.md file for QoD service - - -The following steps are needed to create and deploy docker image for camara cucumber tests: - -1. ```mvn clean package``` - -2. ```docker build -t cucumber .``` - -3. ```docker run -dp 9091:9091 -p cucumber``` diff --git a/code/cucumber/pom.xml b/code/cucumber/pom.xml deleted file mode 100644 index adb0c681dd..0000000000 --- a/code/cucumber/pom.xml +++ /dev/null @@ -1,174 +0,0 @@ - - - 4.0.0 - - - gitlab-maven - https://mvnrepository.com/artifact/org.apache.maven/maven-core - - - QoD-Api-Tests - QoD-Api-Tests - 0.0.1-SNAPSHOT - jar - - Deutsche Telekom AG - - - 17 - 17 - 17 - apache_v2 - CAMARA Project - 2022 - 2023 - - - - org.apache.httpcomponents - httpclient - 4.5.13 - - - io.rest-assured - rest-assured - 5.3.0 - test - - - io.cucumber - cucumber-jvm-deps - 1.0.6 - provided - - - com.jayway.jsonpath - json-path - 2.7.0 - - - com.fasterxml.jackson.core - jackson-annotations - 2.14.0 - - - com.fasterxml.jackson.core - jackson-core - 2.14.0 - - - com.fasterxml.jackson.core - jackson-databind - 2.14.0 - - - io.cucumber - cucumber-java - 7.11.1 - test - - - io.cucumber - cucumber-junit-platform-engine - 7.11.1 - test - - - org.junit.platform - junit-platform-suite - 1.9.2 - test - - - org.junit.jupiter - junit-jupiter - 5.9.0 - test - - - tech.grasshopper - extentreports-cucumber7-adapter - 1.7.0 - - - com.aventstack - extentreports - 5.0.9 - - - org.springframework - spring-beans - 5.3.24 - - - org.projectlombok - lombok - 1.18.24 - provided - - - com.fasterxml.jackson.dataformat - jackson-dataformat-yaml - 2.14.2 - - - com.github.tomakehurst - wiremock - 2.27.2 - test - - - - - - org.codehaus.mojo - license-maven-plugin - 2.0.0 - - . - THIRD-PARTY.md - templates/third-party.ftl - camara - false - true - **/*.java - src - true - --- - Contributors | ${project.organization.name} to CAMARA a Series of LF Projects, LLC - The contributor of this file confirms his sign-off for the Developer Certificate of Origin - (https://developercertificate.org). - - ---license-start - ---license-end - true - true - - - - org.apache.maven.plugins - maven-compiler-plugin - 3.7.0 - - 17 - 17 - UTF-8 - - - - org.apache.maven.plugins - maven-surefire-plugin - 3.0.0-M5 - - - - cucumber.junit-platform.naming-strategy=long - - - - - - - diff --git a/code/cucumber/src/test/java/runners/TestRunner.java b/code/cucumber/src/test/java/runners/TestRunner.java deleted file mode 100644 index 96ea56cea5..0000000000 --- a/code/cucumber/src/test/java/runners/TestRunner.java +++ /dev/null @@ -1,56 +0,0 @@ -/*- - * ---license-start - * CAMARA Project - * --- - * Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC - * - * The contributor of this file confirms his sign-off for the - * Developer Certificate of Origin - * (https://developercertificate.org). - * --- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ---license-end - */ - -package runners; - -import static io.cucumber.core.options.Constants.FILTER_TAGS_PROPERTY_NAME; -import static io.cucumber.core.options.Constants.GLUE_PROPERTY_NAME; -import static io.cucumber.core.options.Constants.PLUGIN_PROPERTY_NAME; -import static io.cucumber.core.options.Constants.PLUGIN_PUBLISH_QUIET_PROPERTY_NAME; - -import org.junit.platform.suite.api.ConfigurationParameter; -import org.junit.platform.suite.api.ConfigurationParameters; -import org.junit.platform.suite.api.IncludeEngines; -import org.junit.platform.suite.api.SelectClasspathResource; -import org.junit.platform.suite.api.Suite; - -@Suite -@IncludeEngines("cucumber") -@SelectClasspathResource("feature") -@ConfigurationParameters({ - @ConfigurationParameter(key = GLUE_PROPERTY_NAME, value = "stepDefinitions"), - @ConfigurationParameter(key = FILTER_TAGS_PROPERTY_NAME, value = "@QoDSanity"), - @ConfigurationParameter(key = PLUGIN_PUBLISH_QUIET_PROPERTY_NAME, value = "true"), - @ConfigurationParameter( - key = PLUGIN_PROPERTY_NAME, - value = "pretty, " - + "html:target/cucumber-reports/Cucumber.html, " - + "json:target/cucumber-reports/Cucumber.json, " - + "junit:target/cucumber-reports/Cucumber.xml, " - + "com.aventstack.extentreports.cucumber.adapter.ExtentCucumberAdapter:") -}) -public class TestRunner { - -} - diff --git a/code/cucumber/src/test/java/stepDefinitions/AppConfig.java b/code/cucumber/src/test/java/stepDefinitions/AppConfig.java deleted file mode 100644 index 323f45b69d..0000000000 --- a/code/cucumber/src/test/java/stepDefinitions/AppConfig.java +++ /dev/null @@ -1,145 +0,0 @@ -/*- - * ---license-start - * CAMARA Project - * --- - * Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC - * - * The contributor of this file confirms his sign-off for the - * Developer Certificate of Origin - * (https://developercertificate.org). - * --- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ---license-end - */ - -package stepDefinitions; - -public class AppConfig { - - public static final String BASE_URL = "http://localhost:9091"; - public static final int SCEF_PORT = Integer.parseInt("8081"); - public static final String SCEF_PATH = "/3gpp-as-session-with-qos/v1/scs"; - - public static final String SESSION_ID = "80a7db98-6d1b-46c8-a602-fd6370fe5a21"; - public static final String JSON_STRING_MANDATORY = """ - { - "duration": 10, - "ueId": { - "msisdn": "12345678901", - "ipv4addr": "192.168.0.0/24" - }, - "asId": { - "ipv4addr": "192.168.0.0/24" - }, - "qos": "QOS_E" - } - """; - - public static final String JSON_STRING_ALL_PARAMS = """ - { - "duration": 10, - "ueId": { - "externalId": "123456789@domain.com", - "msisdn": "1234567812", - "ipv4addr": "192.168.1.0/24" - }, - "asId": { - "ipv4addr": "192.168.1.0/24" - }, - "uePorts": { - "ranges": [ - { - "from": 5010, - "to": 5020 - } - ], - "ports": [ - 5060, - 5070 - ] - }, - "asPorts": { - "ranges": [ - { - "from": 5010, - "to": 5020 - } - ], - "ports": [ - 5060, - 5070 - ] - }, - "qos": "QOS_E", - "notificationUri": "http://127.0.0.1:8000/notifications", - "notificationAuthToken": "c8974e592c2fa383d4a3960714" - } - - """; - public static final String JSON_STRING_MANDATORY_PARAMS = """ - { - "duration": 10, - "ueId": { - "msisdn": "12345678902", - "ipv4addr": "192.168.0.0/24" - }, - "asId": { - "ipv4addr": "192.168.0.0/24" - }, - "qos": "" - } - """; - - - public static final String JSON_STRING_ALL = """ - { - "duration": 10, - "ueId": { - "externalId": "123456789@domain.com", - "msisdn": "1234567812", - "ipv4addr": "192.168.1.0/24" - }, - "asId": { - "ipv4addr": "192.168.1.0/24" - }, - "uePorts": { - "ranges": [ - { - "from": 5010, - "to": 5020 - } - ], - "ports": [ - 5060, - 5070 - ] - }, - "asPorts": { - "ranges": [ - { - "from": 5010, - "to": 5020 - } - ], - "ports": [ - 5060, - 5070 - ] - }, - "qos": "QOS_E", - "notificationUri": "http://127.0.0.1:8000/notifications", - "notificationAuthToken": "c8974e592c2fa383d4a3960714" - } - """; - -} diff --git a/code/cucumber/src/test/java/stepDefinitions/Steps.java b/code/cucumber/src/test/java/stepDefinitions/Steps.java deleted file mode 100644 index 9a332131b3..0000000000 --- a/code/cucumber/src/test/java/stepDefinitions/Steps.java +++ /dev/null @@ -1,164 +0,0 @@ -/*- - * ---license-start - * CAMARA Project - * --- - * Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC - * - * The contributor of this file confirms his sign-off for the - * Developer Certificate of Origin - * (https://developercertificate.org). - * --- - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - * ---license-end - */ - -package stepDefinitions; - - -import static com.github.tomakehurst.wiremock.client.WireMock.aResponse; -import static com.github.tomakehurst.wiremock.client.WireMock.configureFor; -import static com.github.tomakehurst.wiremock.client.WireMock.delete; -import static com.github.tomakehurst.wiremock.client.WireMock.post; -import static com.github.tomakehurst.wiremock.client.WireMock.stubFor; -import static com.github.tomakehurst.wiremock.client.WireMock.urlEqualTo; -import static com.github.tomakehurst.wiremock.client.WireMock.urlMatching; -import static org.junit.jupiter.api.Assertions.assertEquals; - -import com.github.tomakehurst.wiremock.WireMockServer; -import com.jayway.jsonpath.JsonPath; -import io.cucumber.java.BeforeAll; -import io.cucumber.java.en.Given; -import io.cucumber.java.en.Then; -import io.cucumber.java.en.When; -import io.restassured.RestAssured; -import io.restassured.specification.RequestSpecification; -import lombok.extern.slf4j.Slf4j; -import org.junit.jupiter.api.AfterAll; - - -@Slf4j -public class Steps { - - private final static String PATH = "/qod/v0/sessions"; - private static WireMockServer wireMockServer; - private io.restassured.response.Response response; - private RequestSpecification request; - - @BeforeAll - public static void setUp() { - wireMockServer = new WireMockServer(AppConfig.SCEF_PORT); - wireMockServer.start(); - } - - @Given("Use the QoD MOCK URL") - public void useTheQoDMOCKURL() { - RestAssured.reset(); - RestAssured.baseURI = AppConfig.BASE_URL; - request = RestAssured.given(); - log.info("Setting up!"); - configureFor("localhost", AppConfig.SCEF_PORT); - RestAssured.port = AppConfig.SCEF_PORT; - stubFor(post(urlEqualTo(AppConfig.SCEF_PATH + "/subscriptions")) - .willReturn(aResponse() - .withStatus(201) - .withHeader("Content-Type", "application/json") - //QoD Session API needs only subscription-id from response and hence only self is considered - .withBody("{\"self\": \"https://foo.com/subscriptions/123\"}") - ) - ); - log.info("MockServer Started"); - stubFor(delete(urlMatching(AppConfig.SCEF_PATH + "/subscriptions/123")).willReturn( - aResponse().withStatus(204))); - } - - public void postRequestByResource(String requestBody) { - request.header("Content-Type", "application/json"); - log.info(requestBody); - response = request.body(requestBody).post(PATH); - log.info("Response HTTP Status code: " + response.getStatusCode()); - log.info("Response Body: " + response.getBody().asString()); - - } - - @When("Create a new QoD session with mandatory parameters") - public void createSession() { - postRequestByResource(AppConfig.JSON_STRING_MANDATORY); - } - - @When("Delete existing QoD session") - public void deleteExistingQoDSession() { - String sessionId = JsonPath.read(response.asString(), "id"); - log.info(sessionId); - String path = PATH + "/" + sessionId; - response = request.delete(path); - } - - @When("Delete Invalid QoD session") - public void deleteInvalidSession() { - String path = PATH + "/" + AppConfig.SESSION_ID; - response = request.delete(path); - } - - @Then("Response code is {int}") - public void checkResponse(int iResponse) { - assertEquals(iResponse, response.getStatusCode()); - } - - @AfterAll - public static void afterAll() { - System.out.println("Running: tearDown"); - wireMockServer.stop(); - } - - - @When("Create a new QoD session with all parameters") - public void createANewQoDSessionWithAllParameters() { - postRequestByResource(AppConfig.JSON_STRING_ALL); - } - - @When("Get QoD session") - public void getSession() { - String sessionId = JsonPath.read(response.asString(), "id"); - String path = PATH + "/" + sessionId; - response = request.get(path); - log.info("Response HTTP Status code: " + response.getStatusCode()); - } - - @Given("Use the QoD MOCK URL with invalid scenario") - public void useTheQoDMOCKURLWithInvalidScenario() { - RestAssured.reset(); - RestAssured.baseURI = AppConfig.BASE_URL; - request = RestAssured.given(); - log.info("Setting up!"); - configureFor("localhost", AppConfig.SCEF_PORT); - RestAssured.port = AppConfig.SCEF_PORT; - stubFor(post(urlEqualTo(AppConfig.SCEF_PATH + "/subscriptions")) - .willReturn(aResponse() - .withStatus(500) - .withHeader("Content-Type", "application/json") - .withBody("{\"self\": \"https://foo.com/subscriptions/\"}") - ) - ); - } - - @When("Create a new QoD session with parameters") - public void createANewQoDSessionWithParameters() { - - postRequestByResource(AppConfig.JSON_STRING_MANDATORY_PARAMS); - } - - @When("Create a new QoD session along with all parameters") - public void createANewQoDSessionAlongWithAllParameters() { - postRequestByResource(AppConfig.JSON_STRING_ALL_PARAMS); - } -} diff --git a/code/cucumber/src/test/resources/extent.properties b/code/cucumber/src/test/resources/extent.properties deleted file mode 100644 index a87b806aee..0000000000 --- a/code/cucumber/src/test/resources/extent.properties +++ /dev/null @@ -1,8 +0,0 @@ -#PDF Report -extent.reporter.pdf.start=true -extent.reporter.pdf.out=target/cucumber-reports/CucumberExtentReport.pdf -#HTML Report -extent.reporter.html.start=true -extent.reporter.html.out=target/cucumber-reports/CucumberExtentReport.html - - diff --git a/code/cucumber/src/test/resources/feature/QoD_API_Test.feature b/code/cucumber/src/test/resources/feature/QoD_API_Test.feature deleted file mode 100644 index fdc6e40750..0000000000 --- a/code/cucumber/src/test/resources/feature/QoD_API_Test.feature +++ /dev/null @@ -1,70 +0,0 @@ -#/*- ---license-start -#* CAMARA Project -#* --- -#* Copyright (C) 2022 - 2023 Contributors | Deutsche Telekom AG to CAMARA a Series of LF Projects, LLC -#* The contributor of this file confirms his sign-off for the -#* Developer Certificate of Origin (http://developercertificate.org). -#* --- -#* Licensed under the Apache License, Version 2.0 (the "License"); -#* you may not use this file except in compliance with the License. -#* You may obtain a copy of the License at -#* -#* http://www.apache.org/licenses/LICENSE-2.0 -#* -#* Unless required by applicable law or agreed to in writing, software -#* distributed under the License is distributed on an "AS IS" BASIS, -#* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -#* See the License for the specific language governing permissions and -#* limitations under the License. -#* ---license-end -#*/ - -@QoD @QoDSanity -Feature: Automated QoD System Integration Test - - @QQoDSessionCreateGetDelete - Scenario: Create QoD session with mandatory parameters - Given Use the QoD MOCK URL - When Create a new QoD session with mandatory parameters - Then Response code is 201 - When Get QoD session - Then Response code is 200 - When Delete existing QoD session - Then Response code is 204 - - @QoDSessionCreateGetDeleteAllparams - Scenario: Create QoD session with all parameters & Deletion of Session id - Given Use the QoD MOCK URL - When Create a new QoD session with all parameters - Then Response code is 201 - When Get QoD session - Then Response code is 200 - When Delete existing QoD session - Then Response code is 204 - - @QoDCreateSessionDeleteInvalidSession - Scenario: Delete a Invalid QoD session for session id - Given Use the QoD MOCK URL - When Create a new QoD session with mandatory parameters - Then Response code is 201 - When Delete Invalid QoD session - Then Response code is 404 - - - @QoDInvalidCreateSession - Scenario: QoD session with 5XX response - # Test with end point not reachable - Given Use the QoD MOCK URL with invalid scenario - When Create a new QoD session along with all parameters - Then Response code is 500 - - - @QoDInvalidCreateSessionpayload - Scenario: QoD session with invalid payload 4XX - # Test with invalid Payload - Given Use the QoD MOCK URL with invalid scenario - When Create a new QoD session with parameters - Then Response code is 400 - - - diff --git a/code/cucumber/src/test/resources/logback.xml b/code/cucumber/src/test/resources/logback.xml deleted file mode 100644 index 13a47f70c9..0000000000 --- a/code/cucumber/src/test/resources/logback.xml +++ /dev/null @@ -1,13 +0,0 @@ - - - - - %d{dd-MM-yyyy HH:mm:ss.SSS} [%thread] %-5level %logger{36}.%M - %replace(%msg){'[\r\n]', ''}%n - - - - - - - - \ No newline at end of file diff --git a/documentation/API_documentation/QoD-API-Readiness-Checklist.md b/documentation/API_documentation/QoD-API-Readiness-Checklist.md deleted file mode 100644 index f9a0a0b6fc..0000000000 --- a/documentation/API_documentation/QoD-API-Readiness-Checklist.md +++ /dev/null @@ -1,13 +0,0 @@ -# QoD API Readiness minimum criteria checklist - -
- -| No | Deliverables/Criteria | Mandatory | Status (Contributed/Approved/Pending/Validated/Partly-Validated)| -|----|----------------------------------|-----------|---------------------------- -| 1 |API Spec | Y | Contributed | -| 2 |API Implementation | Y | Contributed | -| 3 |API Documentation | Y | Contributed | -| 4 |User Stories | Y | Contributed | -| 5 |API test cases | Y | Not Contributed | -| 6 |Validated by atleast 2 operators | Y | Partly validated as currently only validated by DT | -| 7 |Security review | N | | diff --git a/documentation/API_documentation/qos-profiles-API-Readiness-Checklist.md b/documentation/API_documentation/qos-profiles-API-Readiness-Checklist.md new file mode 100644 index 0000000000..5c8a80e7f8 --- /dev/null +++ b/documentation/API_documentation/qos-profiles-API-Readiness-Checklist.md @@ -0,0 +1,27 @@ +# API Readiness Checklist + +Checklist for qos-profiles v0.11.0-rc.1 in r1.1 + +| Nr | API release assets | alpha | release-candidate | initial
public | stable
public | Status | Comments | +|----|----------------------------------------------|:-----:|:-----------------:|:-------:|:------:|:----:|:----:| +| 1 | API definition | M | M | M | M | tbd | /code/API_definitions/qos-profiles.yaml | +| 2 | Design guidelines from Commonalities applied | O | M | M | M | tbd | | +| 3 | Guidelines from ICM applied | O | M | M | M | Y | | +| 4 | API versioning convention applied | M | M | M | M | Y | | +| 5 | API documentation | M | M | M | M | Y | inline within YAML | +| 6 | User stories | O | O | O | M | N | link | +| 7 | Basic API test cases & documentation | O | M | M | M | tbd | link | +| 8 | Enhanced API test cases & documentation | O | O | O | M | N | link | +| 9 | Test result statement | O | O | O | M | N | link | +| 10 | API release numbering convention applied | M | M | M | M | Y | | +| 11 | Change log updated | M | M | M | M | tbd | /CHANGELOG.md | +| 12 | Previous public release was certified | O | O | O | M | N | | + +To fill the checklist: +- in the line above the table, replace the api-name, api-version and the rx.y by their actual values for the current API version and release. +- in the Status column, put "Y" (yes) if the release asset is available or fulfilled in the current release, a "N" (no) or a "tbd". Example use of "tbd" is in case an alpha or release-candidate API version does not yet provide all mandatory assets for the release. +- in the Comments column, provide the link to the asset once available, and any other relevant comments. + +Note: the checklists of a public API version and of its preceding release-candidate API version can be the same. + +The documentation for the content of the checklist is here: [API Readiness Checklist](https://wiki.camaraproject.org/x/AgAVAQ) diff --git a/documentation/API_documentation/quality-on-demand-API-Readiness-Checklist.md b/documentation/API_documentation/quality-on-demand-API-Readiness-Checklist.md new file mode 100644 index 0000000000..06bf140bce --- /dev/null +++ b/documentation/API_documentation/quality-on-demand-API-Readiness-Checklist.md @@ -0,0 +1,27 @@ +# API Readiness Checklist + +Checklist for quality-on-demand v0.11.0-rc.1 in r1.1 + +| Nr | API release assets | alpha | release-candidate | initial
public | stable
public | Status | Comments | +|----|----------------------------------------------|:-----:|:-----------------:|:-------:|:------:|:----:|----| +| 1 | API definition | M | M | M | M | Y | /code/API_definitions/quality-on-demand.yaml | +| 2 | Design guidelines from Commonalities applied | O | M | M | M | tbd | | +| 3 | Guidelines from ICM applied | O | M | M | M | Y | | +| 4 | API versioning convention applied | M | M | M | M | Y | | +| 5 | API documentation | M | M | M | M | Y | inline in YAML | +| 6 | User stories | O | O | O | M | ? | /documentation/API_documentation/QoD_User_Story.md | +| 7 | Basic API test cases & documentation | O | M | M | M | tbd | /code/Test_definitions/QoD_API_Test.feature | +| 8 | Enhanced API test cases & documentation | O | O | O | M | N | link | +| 9 | Test result statement | O | O | O | M | N | | +| 10 | API release numbering convention applied | M | M | M | M | Y | | +| 11 | Change log updated | M | M | M | M | tbd | /CHANGELOG.md | +| 12 | Previous public release was certified | O | O | O | M | ? | | + +To fill the checklist: +- in the line above the table, replace the api-name, api-version and the rx.y by their actual values for the current API version and release. +- in the Status column, put "Y" (yes) if the release asset is available or fulfilled in the current release, a "N" (no) or a "tbd". Example use of "tbd" is in case an alpha or release-candidate API version does not yet provide all mandatory assets for the release. +- in the Comments column, provide the link to the asset once available, and any other relevant comments. + +Note: the checklists of a public API version and of its preceding release-candidate API version can be the same. + +The documentation for the content of the checklist is here: [API Readiness Checklist](https://wiki.camaraproject.org/x/AgAVAQ) diff --git a/documentation/MeetingMinutes/README.md b/documentation/MeetingMinutes/README.md index 09d96e3782..81b7e85741 100644 --- a/documentation/MeetingMinutes/README.md +++ b/documentation/MeetingMinutes/README.md @@ -1,5 +1,5 @@ -## Meeting Minutes of Quality on Deman Sub Project +## Meeting Minutes of Quality on Demand Sub Project -Starting with the beginning of 2024 the meeting minutes of Quality on Demand calls are within the CAMARA Wiki at https://wiki.camaraproject.org/display/CAM/Quality+on+Demand+Meeting+Minutes +Starting with the beginning of 2024 the meeting minutes of Quality on Demand calls are within the CAMARA Wiki at https://wiki.camaraproject.org/x/0AOeAQ. Meeting minutes of 2023 and before are here in the repository.