From b039e74516bbbe8792221643484d0fa8ff9ec82c Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 29 Dec 2025 11:11:25 +0000 Subject: [PATCH 01/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.x Test-IDs] Implement new test cases for resource: Analytics and include Keywords and Variables. --- .../Analytics.robot | 238 ++++++++++ .../DataAnalyticsOperationKeywords.robot | 409 ++++++++++++++++++ .../environment/variables.txt | 28 ++ .../jsons/dataAnalyticsRequest.json | 9 + .../schemas/ProblemDetails.schema.json | 32 ++ .../individualTelcoCloudAnalytics.schema.json | 187 ++++++++ .../schemas/telcoCloudAnalytics.schema.json | 191 ++++++++ 7 files changed, 1094 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/ProblemDetails.schema.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot new file mode 100644 index 00000000..b55383b1 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot @@ -0,0 +1,238 @@ +*** Settings *** +Resource environment/variables.txt +Resource DataAnalyticsOperationKeywords.robot +Library REST +... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} +... ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Library JSONSchemaLibrary schemas/ + +*** Test Cases *** +POST Create a new data analytics + [Documentation] Test ID: 12.3.1.1.1 + ... Test title: POST Create a new data analytics + ... Test objective: The objective is to create a new data analytics resource + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-conditions: A new data analytics resource is created + POST Create a new data analytics + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is individualTelcoCloudAnalytics + Check HTTP Response Header Contains Location + Check Postcondition Resource Returned in Location Header Is Available +POST Create a new data analytics - UNPROCESSABLE CONTENT + [Documentation] Test ID: 12.3.1.1.2 + ... Test title: POST Create a new data analytics - UNPROCESSABLE CONTENT + ... Test objective: The objective is to test that a new data analytics resource is not created with invalid content + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST Create a new data analytics with Invalid tcdaType + Check HTTP Response Status Code Is 422 + Check HTTP Response Body Json Schema Is ProblemDetails + +POST Create a new data analytics with permitted authorization scope + [Documentation] Test ID: 12.3.1.1.3 + ... Test title: POST Create a new data analytics with permitted authorization scope + ... Test objective: The objective is to create a new data analytics resource with permitted authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: A new data analytics resource is created + POST Create a new data analytics with permitted authorization scope + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is individualTelcoCloudAnalytics + Check HTTP Response Header Contains Location + Check Postcondition Resource Returned in Location Header Is Available +POST Create a new data analytics with not permitted authorization scope + [Documentation] Test ID: 12.3.1.1.4 + ... Test title: POST Create a new data analytics with not permitted authorization scope + ... Test objective: The objective is to create a new data analytics resource with not permitted authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST Create a new data analytics with not permitted authorization scope + Check HTTP Response Status Code Is 403 + Check HTTP Response Body Json Schema Is ProblemDetails + +POST Create a new data analytics - Unauthorized + [Documentation] Test ID: 12.3.1.1.5 + ... Test title: POST Create a new data analytics - Unauthorized + ... Test objective: The objective is to Create a new data analytics without authorization + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST Create a new data analytics - Unauthorized + Check HTTP Response Status Code Is 401 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET information about Analytics + [Documentation] Test ID: 12.3.1.1.6 + ... Test title: GET information about Analytics + ... Test objective: The objective is to GET information about Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalytics + +GET information about Analytics Bad Request Invalid attribute-based filtering parameters + [Documentation] Test ID: 12.3.1.1.7 + ... Test title: GET information about Analytics Bad Request Invalid attribute-based filtering parameters + ... Test objective: The objective is to get information about Analytics with Invalid attribute-based filtering parameters + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with bad attribute + Check HTTP Response Status Code Is 400 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET information about Analytics Bad Request Invalid attribute selector + [Documentation] Test ID: 12.3.1.1.8 + ... Test title: GET information about Analytics Bad Request Invalid attribute selector + ... Test objective: The objective is to get information about Analytics with Invalid attribute-based filtering parameters + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with bad filter + Check HTTP Response Status Code Is 400 + Check HTTP Response Body Json Schema Is ProblemDetails +GET information about Analytics with "all_fields" attribute selector + [Documentation] Test ID: 12.3.1.1.9 + ... Test title: GET information about Analytics with "all_fields" attribute selector + ... Test objective: The objective is to query information about Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with all_fields attribute selector + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalytics +GET information about Analytics with "exclude_default" attribute selector + [Documentation] Test ID: 12.3.1.1.10 + ... Test title: GET information about Analytics with "exclude_default" attribute selector + ... Test objective: The objective is to query information about Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with exclude_default attribute selector + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalytics + Check Response should not Contains reports + +GET information about Analytics with "fields" attribute selector + [Documentation] Test ID: 12.3.1.1.11 + ... Test title: GET information about Analytics with "fields" attribute selector + ... Test objective: The objective is to query information about Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with fields attribute selector + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalytics + +GET information about Analytics with "exclude_fields" attribute selector + [Documentation] Test ID: 12.3.1.1.12 + ... Test title: GET information about Analytics with "exclude_fields" attribute selector + ... Test objective: The objective is to query information about Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics with exclude_fields attribute selector + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalytics + +GET information about Analytics to get Paged Response + [Documentation] Test ID: 12.3.1.1.13 + ... Test title: GET information about Analytics to get Paged Response + ... Test objective: The objective is to query information about Analytics to get Paged Response + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: The Telco-cloud DAF supports response paging for the Analytics resources + ... Post-Conditions: none + GET Analytics + Check HTTP Response Status Code Is 200 + Check HTTP Response Header Contain Link to next page + +GET information about Analytics as a Paged Response with nextpage_opauque_marker parameter + [Documentation] Test ID: 12.3.1.1.13a + ... Test title: GET information about Analytics as a Paged Response with nextpage_opauque_marker parameter + ... Test objective: The objective is to query information about Analytics as a Paged Response and retrieve the next page using the nextpage_opaque_marker parameter + ... Pre-conditions: A request for retrieving Analytics as a paged response has been successfully issued (Test ID 12.3.1.1.13) + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: The Telco-cloud DAF supports response paging for the Analytics resources + ... Post-Conditions: none + Get Analytics with nextpage_opaque_marker parameter + Check HTTP Response Status Code Is 200 +GET information about Analytics - Bad Request Response too big + [Documentation] Test ID: 12.3.1.1.14 + ... Test title: GET information about Analytics - Bad Request Response too big + ... Test objective: The objective is to test that GET method fail retrieving information about Analytics because Response is too big. + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Analytics + Check HTTP Response Status Code Is 400 + Check HTTP Response Body Json Schema Is ProblemDetails +PUT Analytics - Method not implemented + [Documentation] Test ID: 12.3.1.1.15 + ... Test title: PUT Analytics - Method not implemented + ... Test objective: The objective is to test that PUT method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.3 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PUT Analytics + Check HTTP Response Status Code Is 405 + +PATCH Analytics - Method not implemented + [Documentation] Test ID: 12.3.1.1.16 + ... Test title: PATCH Analytics - Method not implemented + ... Test objective: The objective is to test that PATCH method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PATCH Analytics + Check HTTP Response Status Code Is 405 +DELETE Analytics - Method not implemented + [Documentation] Test ID: 12.3.1.1.17 + ... Test title: DELETE Analytics - Method not implemented + ... Test objective: The objective is to test that DELETE method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.3.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + DELETE Analytics + Check HTTP Response Status Code Is 405 \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot new file mode 100644 index 00000000..25097d4a --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -0,0 +1,409 @@ + +*** Settings *** +Resource environment/variables.txt +Library MockServerLibrary +Library REST +... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} +... ssl_verify=falseLibrary +Library BuiltIn +Library JSONLibrary +Library Collections +Library JSONSchemaLibrary schemas/ +Library String +Library Process +Library OperatingSystem +Library jwt + +*** Keywords *** +POST Create a new data analytics + Log Create data analytics by POST to ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template} = Get File jsons/dataAnalyticsRequest.json + ${body}= Format String ${template} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check Postcondition Resource Returned in Location Header Is Available + Log Going to check postcondition + GET ${response['headers']['Location']} + Integer response status 200 + Log Received a 200 OK as expected + ${contentType}= Output response headers Content-Type + Should Contain ${contentType} application/json + ${result}= Output response body + Validate Json schemas/individualTelcoCloudAnalytics.schema.json ${result} + Log Validated individualTelcoCloudAnalytics schema + +POST Create a new data analytics with Invalid tcdaType + Log Create data analytics by POST to ${apiRoot}/${apiName}/${apiMajorVersion}/data_analytics with Invalid tcdaType + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template} = Get File jsons/dataAnalyticsRequest.json + ${body}= Format String ${template} tcdaType=${invalidTcdaType} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +JWT Encode + [Arguments] ${payload} ${key} ${algorithm} + ${encoded}= Evaluate jwt.encode(${payload}, ${key}, ${algorithm}) + [Return] ${encoded} +POST Create a new data analytics with permitted authorization scope + Log Create a data analytics by POST to ${apiRoot}/${apiName}/${apiMajorVersion}/data_analytics with permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${ANALYTICS_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + ${template} = Get File jsons/dataAnalyticsRequest.json + ${body}= Format String ${template} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +POST Create a new data analytics with not permitted authorization scope + Log Create a new data analytics by POST to ${apiRoot}/${apiName}/${apiMajorVersion}/data_analytics with not permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + ${template} = Get File jsons/dataAnalyticsRequest.json + ${body}= Format String ${template} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +POST Create a new data analytics - Unauthorized + Log Create a new data analytics witout authorization + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${template} = Get File jsons/dataAnalyticsRequest.json + ${body}= Format String ${template} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Get Analytics + Log Query information about Analytics. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Analytics with bad attribute + Log Query information about Analytics with bad attribute. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?attribute_not_exist=some_value + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Analytics with bad filter + Log Query information about Analytics with bad filter. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields=wrong_field + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Analytics with all_fields attribute selector + Log Query information about Analytics, using all_fields attribute selector + Set Headers {"Accept": "${ACCEPT_JSON}"} + Set Headers {"Version": "${API_VERSION}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?all_fields + ${output}= Output response + Set Suite Variable ${response} ${output} +GET Analytics with exclude_default attribute selector + Log Query information about Analytics using exclude_default attribute selector + Set Headers {"Accept": "${ACCEPT_JSON}"} + Set Headers {"Version": "${API_VERSION}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_default + ${output}= Output response + Set Suite Variable ${response} ${output} + +GET Analytics with fields attribute selector + Log Query information about Analytics using fields attribute selector + Set Headers {"Accept": "${ACCEPT_JSON}"} + Set Headers {"Version": "${API_VERSION}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields + ${output}= Output response + Set Suite Variable ${response} ${output} +GET Analytics with exclude_fields attribute selector + Log Query information about Analytics using exclude_fields attribute selector + Set Headers {"Accept": "${ACCEPT_JSON}"} + Set Headers {"Version": "${API_VERSION}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_fields + ${output}= Output response + Set Suite Variable ${response} ${output} + +GET Analytics - Response too big + Log Query analytics with excessive response size + Set Headers {"Accept": "${ACCEPT_JSON}"} + Set Headers {"Version": "${API_VERSION}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + ${output}= Output response + Set Suite Variable ${response} ${output} +Get Analytics with nextpage_opaque_marker parameter + Log Get next page of Analytics + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Log Execute Query using the URI provided in the previous GET request and validate response + Get ${nextPageUri} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +PUT Analytics + log Trying to perform a PUT. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PATCH Analytics + log Trying to perform a PATCH. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +DELETE Analytics + log Trying to perform a DELETE. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/analytics + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +POST Individual Telco-Cloud data Analytics + log Trying to perform a POST. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Individual Telco-Cloud data Analytics + log Trying to get information about an individual Telco-Cloud data Analytics + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +PUT Individual Telco-Cloud data Analytics + log Trying to perform a PUT. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Get Individual Telco-Cloud data Analytics - Not Found + log Trying to get information about an individual Telco-Cloud data Analytics + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${notExistingAnalyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Individual Telco-Cloud data Analytics with permitted authorization scope + log Trying to get information about an Individual Telco-Cloud data Analytics with permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${ANALYTICS_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +GET Individual Telco-Cloud data Analytics with not permitted authorization scope + log Trying to get information about an Individual Telco-Cloud data Analytics with not permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Individual Telco-Cloud data Analytics - Unauthorized + log Trying to get information about an individual Telco-Cloud data Analytics without authorization + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +PATCH Individual Telco-Cloud data Analytics + log Trying to modify an individual Telco-Cloud data Analytics + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE_PATCH}"} + + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${body}= Get File jsons/telcoCloudAnalyticsModifications.json + Patch ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Patch Create a new data analytics - Unprocessable Content + log Trying to modify an individual Telco-Cloud data Analytics with unprocessable content + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE_PATCH}"} + Set Headers {"If-Match": "${original_etag}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${body}= Get File jsons/telcoCloudAnalyticsModificationsEmpty.json + Patch ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +DELETE Individual Telco-Cloud data Analytics + log Trying to delete an individual Telco-Cloud data Analytics + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +POST Individual Telco-Cloud data Analytics report + log Trying to perform a POST. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Get Individual Telco-Cloud data Analytics report + log Trying to get information about an individual Telco-Cloud data Analytics report + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Get Individual Telco-Cloud data Analytics report - Not Found + log Trying to get information about an individual Telco-Cloud data Analytics report + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${notExistingReportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Get Individual Telco-Cloud data Analytics report with permitted authorization scope + log Trying to get information about an Individual Telco-Cloud data Analytics report with permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${ANALYTICS_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Get Individual Telco-Cloud data Analytics report with not permitted authorization scope + log Trying to get information about an Individual Telco-Cloud data Analytics report with not permitted authorization scope. + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + ${scope_value}= Create Dictionary scopeValue=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scope_value} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +GET Individual Telco-Cloud data Analytics report - Unauthorized + log Trying to get information about an individual Telco-Cloud data Analytics report without authorization + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +PUT Individual Telco-Cloud data Analytics report + log Trying to perform a PUT. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +PATCH Individual Telco-Cloud data Analytics report + log Trying to perform a PATCH. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Patch ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +DELETE Individual Telco-Cloud data Analytics report + log Trying to perform a DELETE. This method should not be implemented + Set Headers {"Accept":"${ACCEPT}"} + Set Headers {"Version": "${API_VERSION}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} +Check HTTP Response Status Code Is + [Arguments] ${expected_status} + Should Be Equal As Strings ${response['status']} ${expected_status} + Log Status code validated +Check HTTP Response Header Contain Link to next page + ${linkURL}= Get Value From Json ${response['headers']} $..Link + Should Not Be Empty ${linkURL} + Log Check that Link header contains rel set to next + Should Contain ${linkURL} rel="next" + Log Check that Link header contains URI to next page between <> + ${linkHeaderUri}= Get Regexp Matches ${linkURL} (?<=\<)(.*?)(?=\>) + ${length}= Get Length ${linkHeaderUri} + Should Be Equal As Integers ${length} 0 + Set Global Variable ${nextPageUri} ${linkHeaderUri[0]} +Check HTTP Response Header Contains + [Arguments] ${CONTENT_TYPE} + Should Contain ${response['headers']} ${CONTENT_TYPE} + Log Header is present +Check Response should not Contains + [Arguments] ${argument} + Should Not Contain ${response['body']} ${argument} + Log report is not present +Check HTTP Response Body Json Schema Is + [Arguments] ${input} + Run Keyword If '${input}' == 'ProblemDetails' Should Contain ${response['headers']['Content-Type']} application/problem+json + ... ELSE Should Contain ${response['headers']['Content-Type']} application/json + ${schema} = Catenate SEPARATOR= ${input} .schema.json + Validate Json ${schema} ${response['body']} + Log Json Schema Validation OK \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt new file mode 100644 index 00000000..4d103370 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt @@ -0,0 +1,28 @@ +*** Variables *** +${TCDAS_SCHEMA} https +${TCDAS_HOST} localhost +${TCDAS_PORT} 8080 +${apiRoot} / +${apiName} nfvtcdas +${apiMajorVersion} v1 + +${ACCEPT} application/json +${ACCEPT_JSON} application/json +${CONTENT_TYPE} application/json +${CONTENT_TYPE_PATCH} application/merge-patch+json +${AUTHORIZATION_HEADER} Authorization +${AUTHORIZATION_TOKEN} Bearer 0b79bab50daca910b000d4f1a2b675d604257e42 +${API_VERSION} 1.0.0 +${response}= httpresponse +${invalidTcdaType} RANDOM_TYPE +${AUTH_USAGE} 1 +${OAUTH_Encryption_ALGORITHM} HS256 +${ANALYTICS_SCOPE} nfvtcdas:v1:analytics +${NEG_SCOPE} nfvtcdas:v1:invalid + +${notExistingAnalyticsId} notExistingAnalyticsId +${notExistingReportId} notExistingReportId +${analyticsId} analyticsID +${reportId} reportID +${original_etag} some_etag + diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json new file mode 100644 index 00000000..d53a1d02 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json @@ -0,0 +1,9 @@ +{{ + "tcdaType": "INCIDENT_ANALYSIS", + "controlAttributes": { + "analyticsCollectionInterval": { + "startTime": "date-time" + }, + "objectType": "VNF" + } +}} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ProblemDetails.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ProblemDetails.schema.json new file mode 100644 index 00000000..8c390ac4 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ProblemDetails.schema.json @@ -0,0 +1,32 @@ +{ + "description": "The definition of the general \"ProblemDetails\" data structure from IETF RFC 7807 is reproduced in this structure. Compared to the general framework defined in IETF RFC 7807, the \"status\" and \"details\" attributes are mandated to be included, to ensure that the response contains additional textual information about an error. IETF RFC 7807 foresees extensibility of the \"ProblemDetails\" type. It is possible that particular RESTful NFV-MANO API, or particular implementations, specify extensions to define additional attributes that provide more information about the error.\n", + "type": "object", + "required": [ + "status", + "detail" + ], + "properties": { + "type": { + "description": "A URI reference according to IETF RFC 3986 that identifies the problem type. It is encouraged that the URI provides human-readable documentation for the problem (e.g. using HTML) when dereferenced. When this member is not present, its value is assumed to be \"about:blank\".\n", + "type": "string", + "format": "URI" + }, + "title": { + "description": "A short, human-readable summary of the problem type. It should not change from occurrence to occurrence of the problem, except for purposes of localization. If type is given and other than \"about:blank\", this attribute shall also be provided.\n", + "type": "string" + }, + "status": { + "description": "The HTTP status code for this occurrence of the problem.\n", + "type": "integer" + }, + "detail": { + "description": "A human-readable explanation specific to this occurrence of the problem.\n", + "type": "string" + }, + "instance": { + "description": "A URI reference that identifies the specific occurrence of the problem. It may yield further information if dereferenced.\n", + "type": "string", + "format": "URI" + } + } +} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json new file mode 100644 index 00000000..0decc02c --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json @@ -0,0 +1,187 @@ +{ + "description": "This type represents a Telco-cloud data analytics.\n", + "type": "object", + "required": [ + "analyticsId", + "tcdaType", + "analyticsCollectionInterval", + "_links" + ], + "properties": { + "analyticsId": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "tcdaType": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + }, + "analyticsCollectionInterval": { + "description": "This type represents the time interval of Telco-cloud data to be used in the Telco-cloud data analytics process.\nNOTE: When only the startTime is present, there is no time interval being defined, \n and therefore the provided timing information refers to a specific point in time \n to start the analytics.\n", + "type": "object", + "required": [ + "startTime" + ], + "properties": { + "startTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "endTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + } + } + }, + "locationAreaInfo": { + "description": "The location areas from which available management data is to be involved in the data analytics process.\n", + "type": "array", + "items": { + "description": "This type represents the location information from which available management data is to be involved in a Telco-cloud data analytics process.\nNOTE: If both \"countryCode\" and \"area\" are present, no conflicts should exist\n between the values of these two attributes. In case of conflicts, the API\n producer (i.e. Telco-cloud DAF) shall disregard parts of the geographic\n area signalled by \"area\" that are outside the boundaries of the country\n signalled by \"countryCode\". If \"countryCode\" is absent, it is solely the\n \"area\" attribute that defines the location constraint.\n", + "type": "object", + "properties": { + "countryCode": { + "description": "The two-letter ISO 3166 country code in capital letters. Shall be present in case the \"area\" attribute is absent. May be absent if the \"area\" attribute is present (see note).\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Zero or more elements comprising the civic address. Shall be absent if the \"area\" attribute is present.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } + } + }, + "area": { + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } + }, + "resourceZoneIds": { + "description": "Identifies the resource zone(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "cisClusterIds": { + "description": "Identifies the CIS cluster(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "containerNamespaces": { + "description": "Identifies the container namespace(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "objectInstanceId": { + "description": "Identifies the NFV-MANO managed object instances (e.g. NS instances, VNF instances) to be involved in the data analytics process.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "reports": { + "description": "Information about available reports generated by this Telco-cloud data analytics.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "href", + "readyTime" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + }, + "readyTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "expiryTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "fileSize": { + "description": "An unsigned integer, i.e. an integer that cannot assume negative values. See note 2. NOTE 2: In the JSON instance data model, only the concept of a \"number\" is used to represent numerical data. \n Numbers in JSON can be integral, i.e. have no fractional part, or can include a fractional part. \n The additional numeric types defined in the present document represent constraints on the general \n \"number\" type present in JSON instances which can be enforced \n e.g. during parsing when processing the JSON instance or expressed as constraints in modelling \n languages such as JSON Schema or OpenAPI. \n", + "type": "integer", + "minimum": 0 + } + } + } + }, + "_links": { + "description": "TLinks to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", + "type": "string", + "format": "url" + } + } + } + } + } + } +} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json new file mode 100644 index 00000000..cc66c11a --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json @@ -0,0 +1,191 @@ +{ + "type": "array", + "items": { + "description": "This type represents a Telco-cloud data analytics.\n", + "type": "object", + "required": [ + "analyticsId", + "tcdaType", + "analyticsCollectionInterval", + "_links" + ], + "properties": { + "analyticsId": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "tcdaType": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + }, + "analyticsCollectionInterval": { + "description": "This type represents the time interval of Telco-cloud data to be used in the Telco-cloud data analytics process.\nNOTE: When only the startTime is present, there is no time interval being defined, \n and therefore the provided timing information refers to a specific point in time \n to start the analytics.\n", + "type": "object", + "required": [ + "startTime" + ], + "properties": { + "startTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "endTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + } + } + }, + "locationAreaInfo": { + "description": "The location areas from which available management data is to be involved in the data analytics process.\n", + "type": "array", + "items": { + "description": "This type represents the location information from which available management data is to be involved in a Telco-cloud data analytics process.\nNOTE: If both \"countryCode\" and \"area\" are present, no conflicts should exist\n between the values of these two attributes. In case of conflicts, the API\n producer (i.e. Telco-cloud DAF) shall disregard parts of the geographic\n area signalled by \"area\" that are outside the boundaries of the country\n signalled by \"countryCode\". If \"countryCode\" is absent, it is solely the\n \"area\" attribute that defines the location constraint.\n", + "type": "object", + "properties": { + "countryCode": { + "description": "The two-letter ISO 3166 country code in capital letters. Shall be present in case the \"area\" attribute is absent. May be absent if the \"area\" attribute is present (see note).\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Zero or more elements comprising the civic address. Shall be absent if the \"area\" attribute is present.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } + } + }, + "area": { + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } + }, + "resourceZoneIds": { + "description": "Identifies the resource zone(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "cisClusterIds": { + "description": "Identifies the CIS cluster(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "containerNamespaces": { + "description": "Identifies the container namespace(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + }, + "objectInstanceId": { + "description": "Identifies the NFV-MANO managed object instances (e.g. NS instances, VNF instances) to be involved in the data analytics process.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "reports": { + "description": "Information about available reports generated by this Telco-cloud data analytics.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "href", + "readyTime" + ], + "properties": { + "href": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + }, + "readyTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "expiryTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "fileSize": { + "description": "An unsigned integer, i.e. an integer that cannot assume negative values. See note 2. NOTE 2: In the JSON instance data model, only the concept of a \"number\" is used to represent numerical data. \n Numbers in JSON can be integral, i.e. have no fractional part, or can include a fractional part. \n The additional numeric types defined in the present document represent constraints on the general \n \"number\" type present in JSON instances which can be enforced \n e.g. during parsing when processing the JSON instance or expressed as constraints in modelling \n languages such as JSON Schema or OpenAPI. \n", + "type": "integer", + "minimum": 0 + } + } + } + }, + "_links": { + "description": "TLinks to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", + "type": "string", + "format": "url" + } + } + } + } + } + } + } +} + \ No newline at end of file -- GitLab From ecb994d9ce8a91db4c4a10e6203e656fc021b391 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 29 Dec 2025 11:12:54 +0000 Subject: [PATCH 02/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.2.x Test-IDs] Implement new test cases for resource: Individual Telco-Cloud data Analytics --- .../IndividualTelco-CloudDataAnalytics.robot | 137 ++++++++++++++++++ .../telcoCloudAnalyticsModifications.json | 10 ++ ...telcoCloudAnalyticsModificationsEmpty.json | 3 + ...lcoCloudAnalyticsModifications.schema.json | 119 +++++++++++++++ 4 files changed, 269 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModificationsEmpty.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot new file mode 100644 index 00000000..b93e4328 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot @@ -0,0 +1,137 @@ +*** Settings *** +Resource environment/variables.txt +Resource DataAnalyticsOperationKeywords.robot +Library REST +... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} +... ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Library JSONSchemaLibrary schemas/ + +*** Test Cases *** +POST Individual Telco-Cloud data Analytics - Method not implemented + [Documentation] Test ID: 12.3.1.2.1 + ... Test title: POST Individual Telco-Cloud data Analytics - Method not implemented + ... Test objective: The objective is to test that POST method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST Individual Telco-Cloud data Analytics + Check HTTP Response Status Code Is 405 + +GET Information about an Individual Telco-Cloud data Analytics + [Documentation] Test ID: 12.3.1.2.2 + ... Test title: GET Information about an Individual Telco-Cloud data Analytics + ... Test objective: The objective is to retrieve Information about Individual Telco-Cloud data Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Individual Telco-Cloud data Analytics + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is individualTelcoCloudAnalytics + +GET Individual Telco-Cloud data Analytics - Not Found + [Documentation] Test ID: 12.3.1.2.3 + ... Test title: GET Individual Telco-Cloud data Analytics - Not Found + ... Test objective: The objective is to test the retrieval of information about an "Individual Telco-Cloud data Analytics" resource fails when the resource is not present. + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Telco-Cloud data Analytics - Not Found + Check HTTP Response Status Code Is 404 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET Information about an Individual Telco-Cloud data Analytics with permitted authorization scope + [Documentation] Test ID: 12.3.1.2.4 + ... Test title: GET Information about an Individual Telco-Cloud data Analytics with permitted authorization scope + ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics with permitted authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Individual Telco-Cloud data Analytics with permitted authorization scope + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is individualTelcoCloudAnalytics +GET Information about an Individual Telco-Cloud data Analytics with not permitted authorization scope + [Documentation] Test ID: 12.3.1.2.5 + ... Test title: GET Information about an Individual Telco-Cloud data Analytics with not permitted authorization scope + ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics with not permitted authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Individual Telco-Cloud data Analytics with not permitted authorization scope + Check HTTP Response Status Code Is 403 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET Information about an Individual Telco-Cloud data Analytics - Unauthorized + [Documentation] Test ID: 12.3.1.2.6 + ... Test title: GET Information about an Individual Telco-Cloud data Analytics without authorization + ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics without authprization + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Individual Telco-Cloud data Analytics - Unauthorized + Check HTTP Response Status Code Is 401 + Check HTTP Response Body Json Schema Is ProblemDetails + +PUT Individual Telco-Cloud data Analytics - Method not implemented + [Documentation] Test ID: 12.3.1.2.7 + ... Test title: PUT Individual Telco-Cloud data Analytics - Method not implemented + ... Test objective: The objective is to test that PUT method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.3 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PUT Individual Telco-Cloud data Analytics + Check HTTP Response Status Code Is 405 + +PATCH Individual Telco-Cloud data Analytics + [Documentation] Test ID: 12.3.1.2.8 + ... Test title: PATCH Individual Telco-Cloud data Analytics + ... Test objective: This method modifies an Individual Telco-Cloud data Analytics + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: Telco-Cloud data Analytics modified + PATCH Individual Telco-Cloud data Analytics + Check HTTP Response Status Code Is 202 + Check HTTP Response Body Json Schema Is telcoCloudAnalyticsModifications + +PATCH Individual Telco-Cloud data Analytics - UNPROCESSABLE CONTENT + [Documentation] Test ID: 12.3.1.2.9 + ... Test title: PATCH Individual Telco-Cloud data Analytics - UNPROCESSABLE CONTENT + ... Test objective: This method modifies an Individual Telco-Cloud data Analytics with invalid content + ... Pre-conditions: none + ... Reference: Clause 5.5.4.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Patch Create a new data analytics - Unprocessable Content + Check HTTP Response Status Code Is 422 + Check HTTP Response Body Json Schema Is ProblemDetails + +DELETE Individual Telco-Cloud data Analytics + [Documentation] Test ID: 12.3.1.2.10 + ... Test title: DELETE Individual Telco-Cloud data Analytics + ... Test objective: The objective is to delete a Telco-Cloud data Analytics + ... Pre-conditions: none + ... Reference: Clause 5.4.3.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: Telco-Cloud data Analytics deleted + DELETE Individual Telco-Cloud data Analytics + Check HTTP Response Status Code Is 204 + diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json new file mode 100644 index 00000000..054cfee3 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json @@ -0,0 +1,10 @@ +{{ + "analyticsCollectionInterval": { + "startTime": "date-time" + }, + "locationAreaInfo": [ + { + "countryCode" : "String" + } + ] +}} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModificationsEmpty.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModificationsEmpty.json new file mode 100644 index 00000000..6afd64f3 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModificationsEmpty.json @@ -0,0 +1,3 @@ +{{ + +}} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json new file mode 100644 index 00000000..212bf94a --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json @@ -0,0 +1,119 @@ +{ + "description": "This type represents modifications to a Telco-cloud data analytics. NOTE: At least one of the attributes defined in this type shall be present in request bodies. \n", + "type": "object", + "anyOf": [ + { + "required": [ + "analyticsCollectionInterval" + ] + }, + { + "required": [ + "locationAreaInfo" + ] + } + ], + "properties": { + "analyticsCollectionInterval": { + "description": "This type represents the time interval of Telco-cloud data to be used in the Telco-cloud data analytics process.\nNOTE: When only the startTime is present, there is no time interval being defined, \n and therefore the provided timing information refers to a specific point in time \n to start the analytics.\n", + "type": "object", + "required": [ + "startTime" + ], + "properties": { + "startTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "endTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + } + } + }, + "locationAreaInfo": { + "description": "New values of the \"locationAreaInfo\" attribute. See note\n", + "type": "array", + "items": { + "description": "This type represents the location information from which available management data is to be involved in a Telco-cloud data analytics process.\nNOTE: If both \"countryCode\" and \"area\" are present, no conflicts should exist\n between the values of these two attributes. In case of conflicts, the API\n producer (i.e. Telco-cloud DAF) shall disregard parts of the geographic\n area signalled by \"area\" that are outside the boundaries of the country\n signalled by \"countryCode\". If \"countryCode\" is absent, it is solely the\n \"area\" attribute that defines the location constraint.\n", + "type": "object", + "properties": { + "countryCode": { + "description": "The two-letter ISO 3166 country code in capital letters. Shall be present in case the \"area\" attribute is absent. May be absent if the \"area\" attribute is present (see note).\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Zero or more elements comprising the civic address. Shall be absent if the \"area\" attribute is present.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } + } + }, + "area": { + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } + }, + "resourceZoneIds": { + "description": "Identifies the resource zone(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "cisClusterIds": { + "description": "Identifies the CIS cluster(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "containerNamespaces": { + "description": "Identifies the container namespace(s) is to be involved in a Telco-cloud data analytics process\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } +} \ No newline at end of file -- GitLab From ff09832491a821a12ca8f7caf1b2e52c0388b441 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 29 Dec 2025 11:14:20 +0000 Subject: [PATCH 03/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.3.x Test-IDs] Implement new test cases for resource: Individual Telco-cloud data Analytics report --- ...vidualTelco-cloudDataAnalyticsReport.robot | 122 ++++++++++++++ .../telcoCloudAnalyticsReport.schema.json | 155 ++++++++++++++++++ 2 files changed, 277 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-cloudDataAnalyticsReport.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-cloudDataAnalyticsReport.robot b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-cloudDataAnalyticsReport.robot new file mode 100644 index 00000000..11fd22ed --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-cloudDataAnalyticsReport.robot @@ -0,0 +1,122 @@ +*** Settings *** +Resource environment/variables.txt +Resource DataAnalyticsOperationKeywords.robot +Library REST +... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} +... ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Library JSONSchemaLibrary schemas/ + +*** Test Cases *** +POST Individual Telco-Cloud data Analytics report - Method not implemented + [Documentation] Test ID: 12.3.1.3.1 + ... Test title: POST Individual Telco-Cloud data Analytics report - Method not implemented + ... Test objective: The objective is to test that POST method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST Individual Telco-Cloud data Analytics report + Check HTTP Response Status Code Is 405 +Get Individual Telco-Cloud data Analytics report + [Documentation] Test ID: 12.3.1.3.2 + ... Test title: Get Individual Telco-Cloud data Analytics report + ... Test objective: The objective is to test the retrieval of an individual Telco-Cloud data Analytics report and perform a JSON schema validation of the collected report data structure + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Telco-Cloud data Analytics report + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalyticsReport + +GET Individual Telco-Cloud data Analytics report - Not Found + [Documentation] Test ID: 12.3.1.3.3 + ... Test title: GET Individual Telco-Cloud data Analytics report - Not Found + ... Test objective: The objective is to test the retrieval of information about an "Individual Telco-Cloud data Analytics report" resource fails when the resource is not present. + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Telco-Cloud data Analytics report - Not Found + Check HTTP Response Status Code Is 404 + Check HTTP Response Body Json Schema Is ProblemDetails + +Get Individual Telco-Cloud data Analytics report with permited authorization scope + [Documentation] Test ID: 12.3.1.3.4 + ... Test title: Get Individual Telco-Cloud data Analytics report with permited authorization scope + ... Test objective: The objective is to test the retrieval of an individual Telco-Cloud data Analytics report and perform a JSON schema validation of the collected report data structure with permited authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Telco-Cloud data Analytics report with permitted authorization scope + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is telcoCloudAnalyticsReport + +Get Individual Telco-Cloud data Analytics report with not permited authorization scope + [Documentation] Test ID: 12.3.1.3.5 + ... Test title: Get Individual Telco-Cloud data Analytics report with not permited authorization scope + ... Test objective: The objective is to test the retrieval of an individual Telco-Cloud data Analytics report and perform a JSON schema validation of the collected report data structure with not permited authorization scope + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Telco-Cloud data Analytics report with not permitted authorization scope + Check HTTP Response Status Code Is 403 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET Information about an Individual Telco-Cloud data Analytics report - Unauthorized + [Documentation] Test ID: 12.3.1.3.6 + ... Test title: GET Information about an Individual Telco-Cloud data Analytics report without authorization + ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics report without authprization + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET Individual Telco-Cloud data Analytics report - Unauthorized + Check HTTP Response Status Code Is 401 + Check HTTP Response Body Json Schema Is ProblemDetails + +PUT Individual Telco-Cloud data Analytics report - Method not implemented + [Documentation] Test ID: 12.3.1.3.7 + ... Test title: PUT Individual Telco-Cloud data Analytics report - Method not implemented + ... Test objective: The objective is to test that PUT method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.3 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PUT Individual Telco-Cloud data Analytics report + Check HTTP Response Status Code Is 405 + +PATCH Individual Telco-Cloud data Analytics report - Method not implemented + [Documentation] Test ID: 12.3.1.3.8 + ... Test title: PATCH Individual Telco-Cloud data Analytics report - Method not implemented + ... Test objective: The objective is to test that PATCH method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PATCH Individual Telco-Cloud data Analytics report + Check HTTP Response Status Code Is 405 + +DELETE Individual Telco-Cloud data Analytics report - Method not implemented + [Documentation] Test ID: 12.3.1.3.9 + ... Test title: DELETE Individual Telco-Cloud data Analytics report - Method not implemented + ... Test objective: The objective is to test that DELETE method is not implemented + ... Pre-conditions: none + ... Reference: Clause 5.5.5.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + DELETE Individual Telco-Cloud data Analytics report + Check HTTP Response Status Code Is 405 \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json new file mode 100644 index 00000000..3066de21 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json @@ -0,0 +1,155 @@ +{ + "description": "This type represents a Telco-cloud data analytics report.\nNOTE: This attribute shall be present if the data analytics output represents the results of a successful data analytics process.\n", + "type": "object", + "required": [ + "tcdaType" + ], + "properties": { + "tcdaType": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + }, + "reportGenerationTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "outputPerTcdaType": { + "description": "This type represents the output contained in a Telco-cloud data analytics report.\n", + "type": "object", + "properties": { + "outputForIncidentAnalysis": { + "description": "This type represents the specific output contained in a Telco-cloud data analytics report when the value of “tcdaType” in TelcoCloudAnalytics is INCIDENT_ANALYSIS. To enable Telco-cloud data analytics with type INCIDENT_ANALYSIS, the enabling data may be used by Telco-cloud DAF are provided in table A.2.\n", + "type": "object", + "required": [ + "incidentSourceObjects", + "eventTime", + "issueId", + "perceivedSeverity" + ], + "properties": { + "incidentSourceObjects": { + "description": "Indicates the identifier of the object instance(s) managed by NFV-MANO which are the root cause of the identified incident.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "faultType": { + "description": "Indicates the type of source fault that has caused the incident. Valid values map to “Event type” values or \"Alarm definition identifier\" values of the Alarm as defined in ETSI GS NFV-IFA 045. \n", + "type": "string" + }, + "eventTime": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "issueId": { + "description": "Holds the identifier of the reported incident.\n", + "type": "string" + }, + "perceivedSeverity": { + "description": "This field holds the value to indicate relative level of urgency for operator attention. Valid values map to \"Perceived severity\" values of the Alarm as defined in ETSI GS NFV-IFA 045.\n", + "type": "string" + } + } + }, + "outputForHealthAnalysis": { + "description": "This type represents the specific output contained in a Telco-cloud data analytics report when the value of tcdaType in TelcoCloudAnalytics is HEALTH_ANALYSIS. To enable Telco-cloud data analytics with type HEALTH_ANALYSIS, the enabling data may be used by Telco-cloud DAF are provided in table A.3.\n", + "type": "object", + "required": [ + "healthStatus" + ], + "properties": { + "healthStatus": { + "description": "Indicates the health status of the analysed object instance. Permitted values: -\tHEALTHY: The analysed object instance is running in a healthy statues. -\tSUB_HEALTHY: The analysed object instance is running in a sub healthy statues, e.g. over loaded may cause failure. -\tNOT_HEALTHY: The analysed object instance is running in a not healthy statues, e.g. heavy loaded for long time, the probability of failure is high. \n", + "type": "string", + "enum": [ + "HEALTHY", + "SUB_HEALTHY", + "NOT_HEALTHY" + ] + }, + "analyticsStatistics": { + "description": "Indicates the processed and computed statistics by Telco-cloud DAF, of certain performance data associated to this data analytics process in a time period, e.g. Percentage of times when incoming/outgoing bytes (or packages) of a SAP exceeds a certain threshold in the last 24 hours for the analysed object instance. \n", + "type": "array", + "items": { + "type": "string" + } + }, + "unhealthyObjectInfos": { + "description": "Indicates the constituent objects which are in SUB_HEALTHY or NOT_HEALTHY status in case the analysed object is a NS instance.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "objectInstanceId" + ], + "properties": { + "objectInstanceId": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "unhealthCause": { + "description": "Indicates the analysed cause(s) for respective unhealthy object, e.g. over loaded.\n", + "type": "string" + }, + "recommendedAction": { + "description": "Indicates the recommended action to recover unhealthy object, e.g. to scale or heal constituent VNF instances of the NS instance. \n", + "type": "string" + } + } + } + } + } + }, + "outputForResourceUtilizationAnalysis": { + "description": "This type represents the specific output contained in a Telco-cloud data analytics report when the value of tcdaType in TelcoCloudAnalytics is RESOURCE_UTILIZATION_ANALYSIS. To enable Telco-cloud data analytics with type RESOURCE_UTILIZATION_ANALYSIS, the enabling data may be used by Telco-cloud DAF are provided in table A.4.\n", + "type": "object", + "required": [ + "resourceUtilizationStatus", + "resourceTypes" + ], + "properties": { + "resourceUtilizationStatus": { + "description": "Indicates the resource utilization status of the analysed object instance. Permitted values: -\tNORMAL: The resource been used is in a normal statues. -\tUNDER_UTILIZED: The resource been used is in an under-utilized statues. -\tOVER_UTILIZED: The resource been used is in an over-utilized statues.\n", + "type": "string", + "enum": [ + "NORMAL", + "UNDER_UTILIZED", + "OVER_UTILIZED" + ] + }, + "resourceTypes": { + "description": "Indicates the resource type associated to resourceUtilizationStatus. Permitted values: -\tCOMPUTE: The resource type is compute. -\tSTORAGE: The resource type is storage. -\tNETWORK: The resource type is network.\n", + "type": "array", + "items": { + "type": "string", + "enum": [ + "COMPUTE", + "STORAGE", + "NETWORK" + ] + } + }, + "analyticsStatistics": { + "description": "Indicates the processed and computed statistics by Telco-cloud DAF, of certain performance data associated to this data analytics process in a time period, e.g. Percentage of times when the CPU usage exceeds a certain threshold in the last 24 hours for the analysed object instance. \n", + "type": "array", + "items": { + "type": "string" + } + }, + "recommendedActions": { + "description": "Indicates the recommended actions to resolve the resource utilization issues, e.g. to scale the NS instance or update corresponding NFV-MANO policies impacted by NS instance resource utilization issues. \n", + "type": "string" + } + } + } + } + } + } +} \ No newline at end of file -- GitLab From 2f4c11cc51f967b1d401e8064dca8462b736fa0a Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 29 Dec 2025 11:17:31 +0000 Subject: [PATCH 04/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.7.x Test-IDs] Implement new test cases for resource : API Version --- .../ApiVersion.robot | 214 ++++++++++++++++++ .../schemas/ApiVersionInformation.schema.json | 39 ++++ 2 files changed, 253 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/ApiVersionInformation.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot b/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot new file mode 100644 index 00000000..884b6363 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot @@ -0,0 +1,214 @@ +*** Settings *** +Resource environment/variables.txt +Resource DataAnalyticsOperationKeywords.robot +Library REST +... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} +... ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Library JSONSchemaLibrary schemas/ + +*** Test Cases *** +POST API Version - Method not implemented + [Documentation] Test ID: 12.3.1.7.1 + ... Test title: POST API version - Method not implemented + ... Test objective: The objective is to test that POST method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.1 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST API Version + Check HTTP Response Status Code Is 405 + +GET API Version + [Documentation] Test ID: 12.3.1.7.2 + ... Test title: GET API Version + ... Test objective: The objective is to test that GET method successfully return ApiVersionInformation + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.2 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET API Version + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is ApiVersionInformation + +PUT API Version - Method not implemented + [Documentation] Test ID: 12.3.1.7.3 + ... Test title: PUT API Version - Method not implemented + ... Test objective: The objective is to test that PUT method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.3 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PUT API Version + Check HTTP Response Status Code Is 405 + +PATCH API Version - Method not implemented + [Documentation] Test ID: 12.3.1.7.4 + ... Test title: PATCH API Version - Method not implemented + ... Test objective: The objective is to test that PATCH method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.4 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PATCH API Version + Check HTTP Response Status Code Is 405 + +DELETE API Version - Method not implemented + [Documentation] Test ID: 12.3.1.7.5 + ... Test title: DELETE API Version - Method not implemented + ... Test objective: The objective is to test that DELETE method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.5 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + DELETE API Version + Check HTTP Response Status Code Is 405 + +POST API Version with apiMajorVerion - Method not implemented + [Documentation] Test ID: 12.3.1.7.6 + ... Test title: POST API version with apiMajorVerion - Method not implemented + ... Test objective: The objective is to test that POST method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.1 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + POST API Version + Check HTTP Response Status Code Is 405 + +GET API Version with apiMajorVerion + [Documentation] Test ID: 12.3.1.7.7 + ... Test title: GET API Version with apiMajorVerion + ... Test objective: The objective is to test that GET method successfully return ApiVersionInformation + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.2 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET API Version + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is ApiVersionInformation + +PUT API Version with apiMajorVerion - Method not implemented + [Documentation] Test ID: 12.3.1.7.8 + ... Test title: PUT API Version with apiMajorVerion - Method not implemented + ... Test objective: The objective is to test that PUT method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.3 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PUT API Version + Check HTTP Response Status Code Is 405 + +PATCH API Version with apiMajorVerion - Method not implemented + [Documentation] Test ID: 12.3.1.7.9 + ... Test title: PATCH API Version with apiMajorVerion - Method not implemented + ... Test objective: The objective is to test that PATCH method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.4 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + PATCH API Version + Check HTTP Response Status Code Is 405 + +DELETE API Version with apiMajorVerion - Method not implemented + [Documentation] Test ID: 12.3.1.7.10 + ... Test title: DELETE API Version with apiMajorVerion - Method not implemented + ... Test objective: The objective is to test that DELETE method is not implemented + ... Pre-conditions: none + ... Reference: Clause 9.3.3.3.5 - ETSI GS NFV-SOL 013 [5] v5.2.1 + ... Config ID: config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + DELETE API Version + Check HTTP Response Status Code Is 405 + +*** Keywords *** +POST API Version + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Post ${apiRoot}/${apiName}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +GET API Version + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PUT API Version + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PATCH API Version + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Patch ${apiRoot}/${apiName}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +DELETE API Version + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${apiRoot}/${apiName}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +POST API Version with apiMajorVersion + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Post ${apiRoot}/${apiName}/${apiMajorVersion}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +GET API Version with apiMajorVersion + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PUT API Version with apiMajorVersion + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Put ${apiRoot}/${apiName}/${apiMajorVersion}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +PATCH API Version with apiMajorVersion + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Patch ${apiRoot}/${apiName}/${apiMajorVersion}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +DELETE API Version with apiMajorVersion + Set Headers {"Accept":"${ACCEPT}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Delete ${apiRoot}/${apiName}/${apiMajorVersion}/api_versions + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} + +Check HTTP Response Status Code Is + [Arguments] ${expected_status} + Should Be Equal As Strings ${response['status']} ${expected_status} + Log Status code validated + +Check HTTP Response Body Json Schema Is + [Arguments] ${input} + ${schema} = Catenate SEPARATOR= ${input} .schema.json + Validate Json ${schema} ${response['body']} + Log Json Schema Validation OK \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ApiVersionInformation.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ApiVersionInformation.schema.json new file mode 100644 index 00000000..b3582ea4 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/ApiVersionInformation.schema.json @@ -0,0 +1,39 @@ +{ + "description": "This type represents API version information.\n", + "type": "object", + "required": [ + "uriPrefix", + "apiVersions" + ], + "properties": { + "uriPrefix": { + "description": "Specifies the URI prefix for the API, in the following form {apiRoot}/{apiName}/{apiMajorVersion}/.\n", + "type": "string" + }, + "apiVersions": { + "description": "Version(s) supported for the API signaled by the uriPrefix attribute.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "version" + ], + "properties": { + "version": { + "description": "Identifies a supported version. The value of the version attribute shall be a version identifier as specified in clause 9.1 (SOL013).\n", + "type": "string" + }, + "isDeprecated": { + "description": "If such information is available, this attribute indicates whether use of the version signaled by the version attribute is deprecated (true) or not (false).\nA deprecated version is still supported by the API producer but is recommended not to be used any longer. When a version is no longer supported, it does not appear in the response body.\n", + "type": "boolean" + }, + "retirementDate": { + "description": "Date-time stamp. Representation: String formatted according to IETF RFC 3339.\n", + "type": "string", + "format": "date-time" + } + } + } + } + } +} \ No newline at end of file -- GitLab From 83541ca2f05e8910ea746304e5731dd4f8e6a481 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Mon, 29 Dec 2025 14:36:00 +0100 Subject: [PATCH 05/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.7.x Test-IDs] Renamed Test Ids to 12.3.1.8.x --- .../ApiVersion.robot | 20 +++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot b/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot index 884b6363..8e95f00c 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/ApiVersion.robot @@ -10,7 +10,7 @@ Library JSONSchemaLibrary schemas/ *** Test Cases *** POST API Version - Method not implemented - [Documentation] Test ID: 12.3.1.7.1 + [Documentation] Test ID: 12.3.1.8.1 ... Test title: POST API version - Method not implemented ... Test objective: The objective is to test that POST method is not implemented ... Pre-conditions: none @@ -22,7 +22,7 @@ POST API Version - Method not implemented Check HTTP Response Status Code Is 405 GET API Version - [Documentation] Test ID: 12.3.1.7.2 + [Documentation] Test ID: 12.3.1.8.2 ... Test title: GET API Version ... Test objective: The objective is to test that GET method successfully return ApiVersionInformation ... Pre-conditions: none @@ -35,7 +35,7 @@ GET API Version Check HTTP Response Body Json Schema Is ApiVersionInformation PUT API Version - Method not implemented - [Documentation] Test ID: 12.3.1.7.3 + [Documentation] Test ID: 12.3.1.8.3 ... Test title: PUT API Version - Method not implemented ... Test objective: The objective is to test that PUT method is not implemented ... Pre-conditions: none @@ -47,7 +47,7 @@ PUT API Version - Method not implemented Check HTTP Response Status Code Is 405 PATCH API Version - Method not implemented - [Documentation] Test ID: 12.3.1.7.4 + [Documentation] Test ID: 12.3.1.8.4 ... Test title: PATCH API Version - Method not implemented ... Test objective: The objective is to test that PATCH method is not implemented ... Pre-conditions: none @@ -59,7 +59,7 @@ PATCH API Version - Method not implemented Check HTTP Response Status Code Is 405 DELETE API Version - Method not implemented - [Documentation] Test ID: 12.3.1.7.5 + [Documentation] Test ID: 12.3.1.8.5 ... Test title: DELETE API Version - Method not implemented ... Test objective: The objective is to test that DELETE method is not implemented ... Pre-conditions: none @@ -71,7 +71,7 @@ DELETE API Version - Method not implemented Check HTTP Response Status Code Is 405 POST API Version with apiMajorVerion - Method not implemented - [Documentation] Test ID: 12.3.1.7.6 + [Documentation] Test ID: 12.3.1.8.6 ... Test title: POST API version with apiMajorVerion - Method not implemented ... Test objective: The objective is to test that POST method is not implemented ... Pre-conditions: none @@ -83,7 +83,7 @@ POST API Version with apiMajorVerion - Method not implemented Check HTTP Response Status Code Is 405 GET API Version with apiMajorVerion - [Documentation] Test ID: 12.3.1.7.7 + [Documentation] Test ID: 12.3.1.8.7 ... Test title: GET API Version with apiMajorVerion ... Test objective: The objective is to test that GET method successfully return ApiVersionInformation ... Pre-conditions: none @@ -96,7 +96,7 @@ GET API Version with apiMajorVerion Check HTTP Response Body Json Schema Is ApiVersionInformation PUT API Version with apiMajorVerion - Method not implemented - [Documentation] Test ID: 12.3.1.7.8 + [Documentation] Test ID: 12.3.1.8.8 ... Test title: PUT API Version with apiMajorVerion - Method not implemented ... Test objective: The objective is to test that PUT method is not implemented ... Pre-conditions: none @@ -108,7 +108,7 @@ PUT API Version with apiMajorVerion - Method not implemented Check HTTP Response Status Code Is 405 PATCH API Version with apiMajorVerion - Method not implemented - [Documentation] Test ID: 12.3.1.7.9 + [Documentation] Test ID: 12.3.1.8.9 ... Test title: PATCH API Version with apiMajorVerion - Method not implemented ... Test objective: The objective is to test that PATCH method is not implemented ... Pre-conditions: none @@ -120,7 +120,7 @@ PATCH API Version with apiMajorVerion - Method not implemented Check HTTP Response Status Code Is 405 DELETE API Version with apiMajorVerion - Method not implemented - [Documentation] Test ID: 12.3.1.7.10 + [Documentation] Test ID: 12.3.1.8.10 ... Test title: DELETE API Version with apiMajorVerion - Method not implemented ... Test objective: The objective is to test that DELETE method is not implemented ... Pre-conditions: none -- GitLab From bb17e45f88a9fd47a071946f47cfdf4e931cd5aa Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Mon, 29 Dec 2025 14:46:15 +0100 Subject: [PATCH 06/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.6.1 Test-IDs] Implemented new test for dispatch of Data Analytics Change Notification --- .../Notifications.robot | 66 ++++ .../environment/variables.txt | 19 + .../DataAnalyticsChangeNotification.json | 12 + .../schemas/AnalyticsSubscription.schema.json | 348 ++++++++++++++++++ .../AnalyticsSubscriptions.schema.json | 348 ++++++++++++++++++ 5 files changed, 793 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/Notifications.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Notifications.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Notifications.robot new file mode 100644 index 00000000..38d099e5 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Notifications.robot @@ -0,0 +1,66 @@ +*** Setting *** +Resource environment/variables.txt +Suite Setup Create Sessions +Suite Teardown Terminate All Processes kill=true +Library MockServerLibrary +Library Process +Library OperatingSystem +Library BuiltIn +Library Collections +Library String + + +*** Test Cases *** +Data Analytics Change Notification + [Documentation] Test ID: 12.3.1.6.1 + ... Test title: Data Analytics Change Notification + ... Test objective: The objective is to test the dispatch of Data Analytics Change Notification when changes on the Telco-cloud data analytics occur, and perform a JSON schema and content validation of the delivered notification. The action that triggers the notification under test is an explicit test step, but it is not performed by the test system. + ... Pre-conditions: A subscription for Data Analytics Change Notifications is available in the NFV-MANO. + ... Reference: clause 5.5.8.2.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Trigger the availability of Data Analytics Change Notification (external action) + Check Data Analytics Change Notification Available Http POST Request Body Json Schema Is DataAnalyticsChangeNotification + Check Data Analytics Change Notification Available Http POST Request Body notificationType attribute Is DataAnalyticsChangeNotification + +*** Keywords *** +Trigger the availability of Data Analytics Change Notification (external action) + #do nothing + Log do nothing + +Check Data Analytics Change Notification Available Http POST Request Body Json Schema Is + [Arguments] ${element} + ${schema}= Get File schemas/${element}.schema.json + Configure Notification Forward ${schema} ${callback_endpoint} ${callback_endpoint_fwd} + +Check Data Analytics Change Notification Available Http POST Request Body notificationType attribute Is + [Arguments] ${type} + Configure Notification Data Analytics Change Notification Available Handler ${callback_endpoint_fwd} ${type} + Wait Until Keyword Succeeds 2 min 10 sec Verify Mock Expectation ${notification_request} + Clear Requests ${callback_endpoint} + Clear Requests ${callback_endpoint_fwd} + + +Configure Notification Data Analytics Change Notification Available Handler + [Arguments] ${endpoint} ${type} + ${json}= evaluate {} + set to dictionary ${json} notificationType ${type} + ${BODY}= evaluate json.dumps(${json}) json + Log Creating mock request and response to handle status notification + &{req}= Create Mock Request Matcher POST ${endpoint} body_type="JSON" body=${BODY} + Set Global Variable ${notification_request} ${req} + &{notification_response}= Create Mock Response status_code=204 + Create Mock Expectation ${notification_request} ${notification_response} + +Configure Notification Forward + [Arguments] ${schema} ${endpoint} ${endpoint_fwd} + Log Creating mock Http POST forward to handle ${schema} + &{notification_tmp}= Create Mock Request Matcher POST ${endpoint} body_type="JSON_SCHEMA" body=${schema} + &{notification_fwd}= Create Mock Http Forward ${endpoint_fwd} + Create Mock Expectation With Http Forward ${notification_tmp} ${notification_fwd} + +Create Sessions + Start Process java -jar ${MOCK_SERVER_JAR} -serverPort ${callback_port} alias=mockInstance + Wait For Process handle=mockInstance timeout=5s on_timeout=continue + Create Mock Session ${callback_uri}:${callback_port} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt index 4d103370..f6df8414 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt +++ b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt @@ -26,3 +26,22 @@ ${analyticsId} analyticsID ${reportId} reportID ${original_etag} some_etag +${subscriptionId} yoursubscriptionid + +${callbackResp} http://localhost + +{callback_port} 9091 +${callback_uri} http://localhost:${callback_port} +${unreachable_callback_uri} http://unreachable_callback_uri-error-code-422 +${callback_endpoint} /subscriptions +${filter_ok} callbackUri=${callbackUri} +${filter_ko} erroneousFilter=erroneous +${callback_endpoint_fwd} /endpoint/check + +${total_polling_time} 2 min +${polling_interval} 10 sec + +${notification_request} [] +${notification_response} [] + +${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies.jar \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json new file mode 100644 index 00000000..b0121303 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json @@ -0,0 +1,12 @@ +{{ + "id": "", + "notificationType": "DataAnalyticsChangeNotification", + "analyticsId": "{analyticsId}", + "timeStamp": "", + "notificationStatus": "", + "analysisStatus": "", + "failureReason": "", + "_links": {{ + "analytics": "" + }} +}} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json new file mode 100644 index 00000000..326d5f45 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json @@ -0,0 +1,348 @@ +{ + "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", + "type": "object", + "required": [ + "callbackUri" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "filter": { + "description": "This type represents a subscription filter related to notifications about Telco-cloud data analytics change. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n", + "type": "object", + "properties": { + "objectInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match Object Instance.\n", + "type": "object", + "properties": { + "vnfInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match VNF instances. * NOTE 1:\tThe attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances\n that are based on certain VNFDs in a filter. They should not be used both in the same filter instance,\n but one alternative should be chosen.\n NOTE 2:\tThe attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF\n instances in a filter. They should not be used both in the same filter instance, but one alternative\n should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "vnfdId" + ] + }, + { + "required": [ + "vnfProductsFromProviders" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "vnfInstanceIds" + ] + }, + { + "required": [ + "vnfInstanceNames" + ] + } + ] + } + ], + "properties": { + "vnfdIds": { + "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfProductsFromProviders": { + "description": "If present, match VNF instances that belong to VNF products from certain providers. See note 1.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfProvider" + ], + "properties": { + "vnfProvider": { + "description": "Name of the VNF provider to match.\n", + "type": "string" + }, + "vnfProducts": { + "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfProductName" + ], + "properties": { + "vnfProductName": { + "description": "Name of the VNF product to match.\n", + "type": "string" + }, + "versions": { + "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfSoftwareVersion" + ], + "properties": { + "vnfSoftwareVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfdVersions": { + "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "description": "A version.\n", + "type": "string" + } + } + } + } + } + } + } + } + } + } + }, + "vnfInstanceIds": { + "description": "If present, match VNF instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfInstanceNames": { + "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nsInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match NS instances.\nNOTE 1: The attributes \"nsdIds\", \"vnfdIds\" and \"pnfdIds\" are alternatives to reference to NS instances that are created based on certain NSDs, or contain VNF instances that are based on certain VNFDs, or contain PNFs that are based on certain PNFDs in a filter. They should not be used together in the same filter instance, but one alternative should be chosen.\nNOTE 2: The attributes \"nsInstanceIds\" and \"nsInstanceNames\" are alternatives to reference to particular NS Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "nsdIds" + ] + }, + { + "required": [ + "vnfdIds" + ] + }, + { + "required": [ + "pnfdIds" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "nsInstanceIds" + ] + }, + { + "required": [ + "nsInstanceNames" + ] + } + ] + } + ], + "properties": { + "nsdIds": { + "description": "If present, match NS instances that were created based on a NSD identified by one of the nsdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfdIds": { + "description": "If present, match NS instances that contain VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "pnfdIds": { + "description": "If present, match NS instances that contain PNFs that are represented by a PNFD identified by one of the pnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceIds": { + "description": "If present, match NS instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceNames": { + "description": "If present, match NS instances with a NS Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "tcdaTypes": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", + "type": "array", + "items": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + } + }, + "locationAreaFilters": { + "description": "Match Telco-cloud data analytics with location criteria listed in this attribute.\n", + "type": "array", + "items": { + "description": "This type represents subscription filter criteria to match location areas.\n", + "type": "object", + "properties": { + "countryCode": { + "description": "If present, match location areas with a county code listed in this attribute.\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } + } + }, + "area": { + "description": "If present, match location areas with a Geographic area listed in this attribute. NOTE: The attributes \"civicAddressElement\" and \"area\" are alternatives to reference to particular location in a filter. \n They should not be used both in the same filter instance, but one alternative should be chosen.\n", + "type": "array", + "items": { + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } + } + }, + "resourceZoneIds": { + "description": "If present, match location areas with resource zone identifiers listed in this attribute.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "cisClusterIds": { + "description": "If present, match location areas with CIS cluster identifiers listed in this attribute.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "containerNamespaces": { + "description": "If present, match location areas with container namespaces listed in this attribute.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "callbackUri": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + }, + "_links": { + "description": "TLinks to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", + "type": "string", + "format": "url" + } + } + } + } + } + } +} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json new file mode 100644 index 00000000..326d5f45 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json @@ -0,0 +1,348 @@ +{ + "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", + "type": "object", + "required": [ + "callbackUri" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "filter": { + "description": "This type represents a subscription filter related to notifications about Telco-cloud data analytics change. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n", + "type": "object", + "properties": { + "objectInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match Object Instance.\n", + "type": "object", + "properties": { + "vnfInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match VNF instances. * NOTE 1:\tThe attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances\n that are based on certain VNFDs in a filter. They should not be used both in the same filter instance,\n but one alternative should be chosen.\n NOTE 2:\tThe attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF\n instances in a filter. They should not be used both in the same filter instance, but one alternative\n should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "vnfdId" + ] + }, + { + "required": [ + "vnfProductsFromProviders" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "vnfInstanceIds" + ] + }, + { + "required": [ + "vnfInstanceNames" + ] + } + ] + } + ], + "properties": { + "vnfdIds": { + "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfProductsFromProviders": { + "description": "If present, match VNF instances that belong to VNF products from certain providers. See note 1.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfProvider" + ], + "properties": { + "vnfProvider": { + "description": "Name of the VNF provider to match.\n", + "type": "string" + }, + "vnfProducts": { + "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfProductName" + ], + "properties": { + "vnfProductName": { + "description": "Name of the VNF product to match.\n", + "type": "string" + }, + "versions": { + "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfSoftwareVersion" + ], + "properties": { + "vnfSoftwareVersion": { + "description": "A version.\n", + "type": "string" + }, + "vnfdVersions": { + "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "description": "A version.\n", + "type": "string" + } + } + } + } + } + } + } + } + } + } + }, + "vnfInstanceIds": { + "description": "If present, match VNF instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfInstanceNames": { + "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "nsInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match NS instances.\nNOTE 1: The attributes \"nsdIds\", \"vnfdIds\" and \"pnfdIds\" are alternatives to reference to NS instances that are created based on certain NSDs, or contain VNF instances that are based on certain VNFDs, or contain PNFs that are based on certain PNFDs in a filter. They should not be used together in the same filter instance, but one alternative should be chosen.\nNOTE 2: The attributes \"nsInstanceIds\" and \"nsInstanceNames\" are alternatives to reference to particular NS Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "nsdIds" + ] + }, + { + "required": [ + "vnfdIds" + ] + }, + { + "required": [ + "pnfdIds" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "nsInstanceIds" + ] + }, + { + "required": [ + "nsInstanceNames" + ] + } + ] + } + ], + "properties": { + "nsdIds": { + "description": "If present, match NS instances that were created based on a NSD identified by one of the nsdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfdIds": { + "description": "If present, match NS instances that contain VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "pnfdIds": { + "description": "If present, match NS instances that contain PNFs that are represented by a PNFD identified by one of the pnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceIds": { + "description": "If present, match NS instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceNames": { + "description": "If present, match NS instances with a NS Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + }, + "tcdaTypes": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", + "type": "array", + "items": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + } + }, + "locationAreaFilters": { + "description": "Match Telco-cloud data analytics with location criteria listed in this attribute.\n", + "type": "array", + "items": { + "description": "This type represents subscription filter criteria to match location areas.\n", + "type": "object", + "properties": { + "countryCode": { + "description": "If present, match location areas with a county code listed in this attribute.\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } + } + }, + "area": { + "description": "If present, match location areas with a Geographic area listed in this attribute. NOTE: The attributes \"civicAddressElement\" and \"area\" are alternatives to reference to particular location in a filter. \n They should not be used both in the same filter instance, but one alternative should be chosen.\n", + "type": "array", + "items": { + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } + } + }, + "resourceZoneIds": { + "description": "If present, match location areas with resource zone identifiers listed in this attribute.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "cisClusterIds": { + "description": "If present, match location areas with CIS cluster identifiers listed in this attribute.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "containerNamespaces": { + "description": "If present, match location areas with container namespaces listed in this attribute.\n", + "type": "array", + "items": { + "type": "string" + } + } + } + } + } + } + }, + "callbackUri": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + }, + "_links": { + "description": "TLinks to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", + "type": "string", + "format": "url" + } + } + } + } + } + } +} \ No newline at end of file -- GitLab From 62b58c8d136cea82bf9c59c8ed904faf42926570 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Mon, 29 Dec 2025 14:47:55 +0100 Subject: [PATCH 07/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.6.1 Test-IDs] Implemented new test for Data Analytics Change Notification delivery --- .../NotificationEndpoint.robot | 47 +++++++++++++++++++ 1 file changed, 47 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/NotificationEndpoint.robot diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/NotificationEndpoint.robot b/SOL025/TelcoCloudDataAnalyticsService-API/NotificationEndpoint.robot new file mode 100644 index 00000000..130bed3e --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/NotificationEndpoint.robot @@ -0,0 +1,47 @@ +*** Settings *** +Library JSONSchemaLibrary schemas/ +Resource environment/variables.txt +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Library String +Suite Setup Check resource existence and get CallbackUri + +*** Test Cases *** +Data Analytics Change Notification Delivery + [Documentation] Test ID: 12.3.1.7.1 + ... Test title: Data Analytics Change Notification Delivery + ... Test objective: The objective is to test that Data Analytics Change Notification is delivered with success to the notification consumer + ... Pre-conditions: A subscription for information availability notification is available in the NFV-MANO. + ... Reference: clause 5.5.8.2.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_Notif_Endpoint + ... Applicability: none + ... Post-Conditions: none + Post Data Analytics Change Notification + Check HTTP Response Status Code Is 204 + +*** Keywords *** +Check resource existence and get CallbackUri + Set Headers {"Accept":"${ACCEPT_JSON}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + Get ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + Integer response status 200 + Validate Json response body AnalyticsSubscription.schema.json + Set Global Variable ${callbackResp} response body callbackUri + +Check HTTP Response Status Code Is + [Arguments] ${expected_status} + Should Be Equal As Strings ${response['status']} ${expected_status} + Log Status code validated + +Post Data Analytics Change Notification + log Trying to perform a POST to get notification + Set Headers {"Accept":"${ACCEPT_JSON}"} + Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template} = Get File jsons/DataAnalyticsChangeNotification.json + ${body}= Format String ${template} analyticsId=${analyticsId} + Post ${callbackResp} ${body} + ${outputResponse}= Output response + Set Global Variable ${response} ${outputResponse} -- GitLab From be7b8de08b55124369021925f6f3bff8bc621e05 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Mon, 29 Dec 2025 15:27:33 +0100 Subject: [PATCH 08/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.4.x Test-IDs] Implemented new tests for Telco Data Analytics subscriptions --- .../Analytics.robot | 4 +- .../DataAnalyticsOperationKeywords.robot | 251 +++++++- .../IndividualTelco-CloudDataAnalytics.robot | 4 +- .../Subscriptions.robot | 213 +++++++ .../environment/variables.txt | 9 +- .../jsons/AnalyticsSubscriptionRequest.json | 3 + .../AnalyticsSubscriptions.schema.json | 581 +++++++++--------- 7 files changed, 765 insertions(+), 300 deletions(-) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/jsons/AnalyticsSubscriptionRequest.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot index b55383b1..d091162a 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot @@ -1,9 +1,7 @@ *** Settings *** Resource environment/variables.txt Resource DataAnalyticsOperationKeywords.robot -Library REST -... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} -... ssl_verify=false +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false Library OperatingSystem Library JSONLibrary Library JSONSchemaLibrary schemas/ diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index 25097d4a..0bf5ee16 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -2,9 +2,7 @@ *** Settings *** Resource environment/variables.txt Library MockServerLibrary -Library REST -... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} -... ssl_verify=falseLibrary +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=falseLibrary Library BuiltIn Library JSONLibrary Library Collections @@ -15,6 +13,12 @@ Library OperatingSystem Library jwt *** Keywords *** +Create Sessions + Pass Execution If ${CHECKS_NOTIF_ENDPOINT} == 0 MockServer not necessary to run + Start Process java -jar ${MOCK_SERVER_JAR} -serverPort ${callback_port} alias=mockInstance + Wait For Process handle=mockInstance timeout=5s on_timeout=continue + Create Mock Session ${callback_uri}:${callback_port} + POST Create a new data analytics Log Create data analytics by POST to ${apiRoot}/${apiName}/${apiMajorVersion}/analytics Set Headers {"Accept":"${ACCEPT}"} @@ -406,4 +410,243 @@ Check HTTP Response Body Json Schema Is ... ELSE Should Contain ${response['headers']['Content-Type']} application/json ${schema} = Catenate SEPARATOR= ${input} .schema.json Validate Json ${schema} ${response['body']} - Log Json Schema Validation OK \ No newline at end of file + Log Json Schema Validation OK + +## Subscriptions +Get all Subscriptions + [Documentation] The api consumer can use this method to query the list of active subscriptions to log management notifications + Set headers {"Accept": "application/json"} + Set headers {"Content-Type": "application/json"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get all Subscriptions with permitted authorization scope + [Documentation] The api consumer can use this method to query the list of active subscriptions to log management notifications + Set headers {"Accept": "application/json"} + Set headers {"Content-Type": "application/json"} + ${scopeValue}= Create Dictionary scope=${ANALYTICS_SCOPE} + ${authorizationToken}= JWT Encode payload=${scopeValue} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Log Authorization Token: ${authorizationToken} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get all Subscriptions with not permitted authorization scope + [Documentation] The api consumer can use this method to query the list of active subscriptions to log management notifications + Set headers {"Accept": "application/json"} + Set headers {"Content-Type": "application/json"} + ${scopeValue}= Create Dictionary scope=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scopeValue} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Log Authorization Token: ${authorizationToken} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + + Get Subscriptions with attribute-based filters + [Documentation] The api consumer can use this method to query the list of active subscriptions to log management notifications + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions?${filter_ok} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get Subscriptions with invalid attribute-based filters + [Documentation] The api consumer can use this method to query the list of active subscriptions to log management notifications + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions?${filter_ko} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Send Post Request for Subscription + Set headers {"Content-Type": "${CONTENT_TYPE}"} + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/AnalyticsscriptionRequest.json + ${body_request}= Format String ${template} callback_uri=${callback_uri} callback_endpoint=${callback_endpoint} + POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions ${body_request} + ${output}= Output response + Set Suite Variable ${response} ${output} + Run Keyword If ${CHECKS_NOTIF_ENDPOINT} == 1 Check Notification Endpoint + +Send Post Request for Subscription with Unreachable callbackUri + Log Trying to create a subscription for an unreachable Notification Endpoint + Set headers {"Content-Type": "${CONTENT_TYPE}"} + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/AnalyticsSubscriptionRequest.json + ${body_request}= Format String ${template} callback_uri=${unreachable_callback_uri} callback_endpoint=${callback_endpoint} + POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions ${body_request} + ${output}= Output response + Set Suite Variable ${response} ${output} + Run Keyword If ${CHECKS_NOTIF_ENDPOINT} == 1 Check Notification Endpoint + +Check HTTP Response Body Attributes Values Match the Issued Subscription + Log Check Response matches subscription + ${template}= Get File jsons/AnalyticsSubscriptionRequest.json + ${body}= Format String ${template} callback_uri=${callback_uri} callback_endpoint=${callback_endpoint} + ${subscription}= evaluate json.loads('''${body}''') json + Should Be Equal As Strings ${response['body']['callbackUri']} ${subscription['callbackUri']} + +Check Postcondition Subscription Is Set + Log Check Postcondition subscription exist + Set Headers {"Accept": "${ACCEPT_JSON}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${response['body']['id']} + ${output}= Output response + Set Suite Variable ${response} ${output} + Check HTTP Response Status Code Is 200 + +Send Post Request for Duplicated Subscription + Set headers {"Content-Type": "${CONTENT_TYPE}"} + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + ${template}= Get File jsons/AnalyticsSubscriptionRequest.json + ${body_request}= Format String ${template} callback_uri=${callback_uri} callback_endpoint=${callback_endpoint} + POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions ${body_request} allow_redirects=false + ${output}= Output response + Set Suite Variable ${response} ${output} + +Check GET response from Unreachable Notification Endpoint + Log Creating mock request and response to handle GET operation on unreachable notification endpoint + &{notification_request}= Create Mock Request Matcher GET ${unreachable_callback_uri} + &{notification_response}= Create Mock Response status_code=404 + Log Issue the subscription request + Create Mock Expectation ${notification_request} ${notification_response} + Wait Until Keyword Succeeds ${total_polling_time} ${polling_interval} Verify Mock Expectation ${notification_request} + Clear Requests ${unreachable_callback_uri} + +Check HTTP Response Body Is Empty + Should Be Empty ${response['body']} + Log No json schema is provided. Validation OK + +Check Postcondition Subscription Resource Returned in Location Header Is Available + Log Going to check postcondition + GET ${response['headers']['Location']} + Integer response status 200 + Log Received a 200 OK as expected + ${contentType}= Output response headers Content-Type + Should Contain ${contentType} application/json + ${result}= Output response body + Validate Json Analyticsubscription.schema.json ${result} + Log Validated AnalyticsSubscription schema + +Send Put Request for Subscriptions + [Documentation] This method is not supported. When this method is requested on this resource, the NFV-MANO shall return a "405 Method + ... Not Allowed" response as defined in clause 4.3.5.4. + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + PUT ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + +Send Patch Request for Subscriptions + [Documentation] This method is not supported. When this method is requested on this resource, the NFV-MANO shall return a "405 Method + ... Not Allowed" response as defined in clause 4.3.5.4. + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + PATCH ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + +Send Delete Request for Subscriptions + [Documentation] This method is not supported. When this method is requested on this resource, the NFV-MANO shall return a "405 Method + ... Not Allowed" response as defined in clause 4.3.5.4. + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + DELETE ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get Individual Subscription + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get Individual Subscription with permitted authorization scope + Set headers {"Accept": "${ACCEPT_JSON}"} + ${scopeValue}= Create Dictionary scope=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scopeValue} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Log Authorization Token: ${authorizationToken} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Get Individual Subscription with not permitted authorization scope + Set headers {"Accept": "${ACCEPT_JSON}"} + ${scopeValue}= Create Dictionary scope=${NEG_SCOPE} + ${authorizationToken}= JWT Encode payload=${scopeValue} key='' algorithm=${OAUTH_Encryption_ALGORITHM} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${authorizationToken}"} + Log Authorization Token: ${authorizationToken} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Check HTTP Response Body Subscription Identifier matches the requested Subscription + Log Trying to check response ID + Should Be Equal As Strings ${response['body']['id']} ${subscriptionId} + Log Subscription identifier as expected + +GET individual Subscription with invalid resource identifier + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${erroneousSubscriptionId} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Send Delete request for individual Subscription + Set headers {"Accept": "${ACCEPT_JSON}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + DELETE ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable ${response} ${output} + +Check Postcondition Subscription is Deleted + Log Check Postcondition Subscription is deleted + GET individual Subscription + Check HTTP Response Status Code Is 404 + +Send Delete request for individual Subscription with invalid resource identifier + Log Trying to delete a subscription in the VNFM with invalid id + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + DELETE ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${erroneousSubscriptionId} + ${output}= Output response + Set Suite Variable @{response} ${output} + +Send Post request for individual Subscription + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + POST ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${newSubscriptionId} + ${output}= Output response + Set Suite Variable @{response} ${output} + +Send Put request for individual Subscription + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${origOutput}= Output response + Set Suite Variable ${origResponse} ${origOutput} + PUT ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable @{response} ${output} + +Send Patch request for individual Subscription + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${origOutput}= Output response + Set Suite Variable ${origResponse} ${origOutput} + PATCH ${apiRoot}/${apiName}/${apiMajorVersion}/subscriptions/${subscriptionId} + ${output}= Output response + Set Suite Variable @{response} ${output} + +Check HTTP Response Header Contains Link + ${linkURL}= Get Value From Json ${response['headers']} $..Link + Should Not Be Empty ${linkURL} + +Check Notification Endpoint + &{notification_request}= Create Mock Request Matcher GET ${callback_endpoint} + &{notification_response}= Create Mock Response headers="Content-Type: application/json" status_code=204 + Create Mock Expectation ${notification_request} ${notification_response} + Wait Until Keyword Succeeds ${total_polling_time} ${polling_interval} Verify Mock Expectation ${notification_request} + Clear Requests ${callback_endpoint} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot index b93e4328..74464449 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot @@ -1,9 +1,7 @@ *** Settings *** Resource environment/variables.txt Resource DataAnalyticsOperationKeywords.robot -Library REST -... ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} -... ssl_verify=false +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false Library OperatingSystem Library JSONLibrary Library JSONSchemaLibrary schemas/ diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot new file mode 100644 index 00000000..fe408ada --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot @@ -0,0 +1,213 @@ +*** Settings *** +Library JSONSchemaLibrary schemas/ +Resource environment/variables.txt +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Resource DataAnalyticsOperationKeywords.robot +Library MockServerLibrary +Library Process +Suite Setup Create Sessions +Suite Teardown Terminate All Processes kill=true + +*** Test Cases *** +GET all Subscriptions + [Documentation] Test ID: 12.3.1.4.1 + ... Test title: GET all Subscriptions + ... Test objective: The objective is to test the retrieval list of active subscriptions of API consumer and perform a JSON schema validation of the returned subscriptions data structure. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscriptions + +GET Subscriptions with attribute-based filter + [Documentation] Test ID: 12.3.1.4.2 + ... Test title: GET Subscriptions with attribute-based filter + ... Test objective: The objective is to test the retrieval of active subscriptions list of API consumer using attribute-based filter and perform a JSON schema validation of the collected data structure. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Subscriptions with attribute-based filters + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscriptions + +GET Subscriptions with Paged Response + [Documentation] Test ID: 12.3.1.4.3 + ... Test title: GET Subscriptions with Paged Response + ... Test objective: The objective is to query information of active subscriptions list of API consumer to get Paged Response. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions + Check HTTP Response Status Code Is 200 + Check HTTP Response Header Contains Link + +GET Subscriptions - invalid attribute-based filter + [Documentation] Test ID: 12.3.1.4.4 + ... Test title: GET Subscriptions - invalid attribute-based filter + ... Test objective: The objective is to test that the retrieval of active subscriptions list of API consumer fails when using invalid attribute-based filters, and perform the JSON schema validation of the failed operation HTTP response. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Subscriptions with invalid attribute-based filters + Check HTTP Response Status Code Is 400 + Check HTTP Response Body Json Schema Is ProblemDetails + + +GET Subscriptions - Bad Request Response too Big + [Documentation] Test ID: 12.3.1.4.5 + ... Test title: GET Subscriptions - Bad Request Response too Big + ... Test objective: The objective is to test that the retrieval of active subscriptions list of API consumer fails when response is too big, and perform the JSON schema validation of the failed operation HTTP response. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions + Check HTTP Response Status Code Is 400 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET Subscriptions - invalid resource endpoint + [Documentation] Test ID: 12.3.1.4.6 + ... Test title: GET Subscriptions - invalid resource endpoint + ... Test objective: The objective is to test that the retrieval of active subscriptions list of API consumer fails when using invalid resource endpoint. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions + Check HTTP Response Status Code Is 404 + +POST Create new Subscription + [Documentation] Test ID: 12.3.1.4.7 + ... Test title: Create new Subscription + ... Test objective: The objective is to test the creation of a new subscription and perform a JSON schema and content validation of the returned subscription data structure + ... Pre-conditions: none + ... Reference: clause 5.5.6.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: The subscription is successfully set and it matches the issued subscription + Send Post Request for Subscription + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is AnalyticsSubscription + Check HTTP Response Header Contains Location + Check Postcondition Subscription Resource Returned in Location Header Is Available + Check HTTP Response Body Attributes Values Match the Issued Subscription + Check Postcondition Subscription Is Set + +POST Create request for duplicated Subscription not creating duplicated subscriptions + [Tags] no-duplicated-subs + [Documentation] Test ID: 12.3.1.4.8 + ... Test title: Create request for duplicated Subscription not creating duplicated subscriptions + ... Test objective: The objective is to test the attempt of a creation of a duplicated subscription failed and check that no new subscription is created and a link to the original subscription is returned + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: The Telco-Cloud DAF does not support the creation of duplicated subscriptions + ... Post-Conditions: The existing Subscription returned is available in the Telco-Cloud DAF + Send Post Request for Duplicated Subscription + Check HTTP Response Status Code Is 303 + Check HTTP Response Body Is Empty + Check HTTP Response Header Contains Location + Check Postcondition Subscription Resource Returned in Location Header Is Available + +POST Create request for duplicated Subscription creating duplicated subscriptions + [Tags] duplicated-subs + [Documentation] Test ID: 12.3.1.4.9 + ... Test title: Create request for duplicated Subscription creating duplicated subscriptions + ... Test objective: The objective is to test the creation of a duplicated subscription and perform a JSON schema and content validation of the returned duplicated subscription data structure + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: The Telco-Cloud DAF supports the creation of duplicated subscriptions + ... Post-Conditions: The duplicated subscription is successfully set and it matches the issued subscription + Send Post Request for Duplicated Subscription + Check HTTP Response Status Code Is 201 + Check HTTP Response Body Json Schema Is AnalyticsSubscription + Check HTTP Response Body Attributes Values Match the Issued Subscription + Check Postcondition Subscription Is Set + +PUT Subscriptions - Method not implemented + [Documentation] Test ID: 12.3.1.4.10 + ... Test title: PUT Subscriptions - Method not implemented + ... Test objective: The objective is to test that PUT method is not allowed to modify subscriptions + ... Pre-conditions: none + ... Reference: clause 5.5.6.3.3 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Put Request for Subscriptions + Check HTTP Response Status Code Is 405 + +PATCH Subscriptions - Method not implemented + [Documentation] Test ID: 12.3.1.4.11 + ... Test title: PATCH Subscriptions - Method not implemented + ... Test objective: The objective is to test that PATCH method is not allowed to update subscriptions + ... Pre-conditions: none + ... Reference: clause 5.5.6.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Patch Request for Subscriptions + Check HTTP Response Status Code Is 405 + +DELETE Subscriptions - Method not implemented + [Documentation] Test ID: 12.3.1.4.12 + ... Test title: DELETE Subscriptions - Method not implemented + ... Test objective: The objective is to test that DELETE method is not allowed to delete subscriptions + ... Pre-conditions: none + ... Reference: clause 5.5.6.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Delete Request for Subscriptions + Check HTTP Response Status Code Is 405 + +POST Create a new subscription - Unprocessable Content + [Documentation] Test ID: 12.3.1.4.13 + ... Test title: POST Create a new Subscription - Unprocessable Content + ... Test objective: The objective is to test that a new subscription is not created if the notification endpoint is unreachable by the Telco-Cloud DAF. + ... Pre-conditions: none + ... Reference: clause 5.5.6.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: Notification endpoint is unreachable by the Telco-Cloud DAF + ... Post-Conditions: none + Send Post Request for Subscription with Unreachable callbackUri + Check HTTP Response Status Code Is 422 + Check HTTP Response Body Json Schema Is ProblemDetails + +GET all Subscriptions with permitted authorization scope + [Documentation] Test ID: 12.3.1.4.14 + ... Test title: GET all Subscriptions with permitted authorization scope + ... Test objective: The objective is to test the retrieval list of active subscriptions of API consumer when a permitted authorization scope is used. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions with permitted authorization scope + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscriptions + +GET all Subscriptions with not permitted authorization scope + [Documentation] Test ID: 12.3.1.4.15 + ... Test title: GET all Subscriptions with not permitted authorization scope + ... Test objective: The objective is to test the retrieval list of active subscriptions of API consumer ffails when a not permitted authorization scope is used. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.6.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get all Subscriptions with not permitted authorization scope + Check HTTP Response Status Code Is 401 diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt index f6df8414..4bf987ff 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt +++ b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt @@ -26,11 +26,18 @@ ${analyticsId} analyticsID ${reportId} reportID ${original_etag} some_etag +${CHECKS_NOTIF_ENDPOINT} 1 ## If true, during subscription, the FUT performs a get to the notification endpoint + ${subscriptionId} yoursubscriptionid +${erroneousSubscriptionId} wrongsubscriptionid +${newSubscriptionId} newsubscriptionid + +${filter_ok} callbackUri=${callback_uri} +${filter_ko} erroneousFilter=erroneous ${callbackResp} http://localhost -{callback_port} 9091 +${callback_port} 9091 ${callback_uri} http://localhost:${callback_port} ${unreachable_callback_uri} http://unreachable_callback_uri-error-code-422 ${callback_endpoint} /subscriptions diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/AnalyticsSubscriptionRequest.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/AnalyticsSubscriptionRequest.json new file mode 100644 index 00000000..97043dcd --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/AnalyticsSubscriptionRequest.json @@ -0,0 +1,3 @@ +{{ + "callbackUri": "{callback_uri}{callback_endpoint}" +}} \ No newline at end of file diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json index 326d5f45..5a12a639 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json @@ -1,109 +1,112 @@ { - "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", - "type": "object", - "required": [ - "callbackUri" - ], - "properties": { - "id": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" - }, - "filter": { - "description": "This type represents a subscription filter related to notifications about Telco-cloud data analytics change. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n", - "type": "object", - "properties": { - "objectInstanceSubscriptionFilter": { - "description": "This type represents subscription filter criteria to match Object Instance.\n", - "type": "object", - "properties": { - "vnfInstanceSubscriptionFilter": { - "description": "This type represents subscription filter criteria to match VNF instances. * NOTE 1:\tThe attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances\n that are based on certain VNFDs in a filter. They should not be used both in the same filter instance,\n but one alternative should be chosen.\n NOTE 2:\tThe attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF\n instances in a filter. They should not be used both in the same filter instance, but one alternative\n should be chosen.\n", - "type": "object", - "anyOf": [ - { - "oneOf": [ - { - "required": [ - "vnfdId" - ] - }, - { - "required": [ - "vnfProductsFromProviders" - ] + "type": "array", + "items": { + "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", + "type": "object", + "required": [ + "callbackUri" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "filter": { + "description": "This type represents a subscription filter related to notifications about Telco-cloud data analytics change. At a particular nesting level in the filter structure, the following applies: All attributes shall match in order for the filter to match (logical \"and\" between different filter attributes). If an attribute is an array, the attribute shall match if at least one of the values in the array matches (logical \"or\" between the values of one filter attribute).\n", + "type": "object", + "properties": { + "objectInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match Object Instance.\n", + "type": "object", + "properties": { + "vnfInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match VNF instances. * NOTE 1:\tThe attributes \"vnfdIds\" and \"vnfProductsFromProviders\" are alternatives to reference to VNF instances\n that are based on certain VNFDs in a filter. They should not be used both in the same filter instance,\n but one alternative should be chosen.\n NOTE 2:\tThe attributes \"vnfInstanceIds\" and \"vnfInstanceNames\" are alternatives to reference to particular VNF\n instances in a filter. They should not be used both in the same filter instance, but one alternative\n should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "vnfdId" + ] + }, + { + "required": [ + "vnfProductsFromProviders" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "vnfInstanceIds" + ] + }, + { + "required": [ + "vnfInstanceNames" + ] + } + ] + } + ], + "properties": { + "vnfdIds": { + "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" } - ] - }, - { - "oneOf": [ - { - "required": [ - "vnfInstanceIds" - ] - }, - { + }, + "vnfProductsFromProviders": { + "description": "If present, match VNF instances that belong to VNF products from certain providers. See note 1.\n", + "type": "array", + "items": { + "type": "object", "required": [ - "vnfInstanceNames" - ] - } - ] - } - ], - "properties": { - "vnfdIds": { - "description": "If present, match VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", - "type": "array", - "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" - } - }, - "vnfProductsFromProviders": { - "description": "If present, match VNF instances that belong to VNF products from certain providers. See note 1.\n", - "type": "array", - "items": { - "type": "object", - "required": [ - "vnfProvider" - ], - "properties": { - "vnfProvider": { - "description": "Name of the VNF provider to match.\n", - "type": "string" - }, - "vnfProducts": { - "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n", - "type": "array", - "items": { - "type": "object", - "required": [ - "vnfProductName" - ], - "properties": { - "vnfProductName": { - "description": "Name of the VNF product to match.\n", - "type": "string" - }, - "versions": { - "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n", - "type": "array", - "items": { - "type": "object", - "required": [ - "vnfSoftwareVersion" - ], - "properties": { - "vnfSoftwareVersion": { - "description": "A version.\n", - "type": "string" - }, - "vnfdVersions": { - "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n", - "type": "array", - "items": { + "vnfProvider" + ], + "properties": { + "vnfProvider": { + "description": "Name of the VNF provider to match.\n", + "type": "string" + }, + "vnfProducts": { + "description": "If present, match VNF instances that belong to VNF products with certain product names, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfProductName" + ], + "properties": { + "vnfProductName": { + "description": "Name of the VNF product to match.\n", + "type": "string" + }, + "versions": { + "description": "If present, match VNF instances that belong to VNF products with certain versions and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "type": "object", + "required": [ + "vnfSoftwareVersion" + ], + "properties": { + "vnfSoftwareVersion": { "description": "A version.\n", "type": "string" + }, + "vnfdVersions": { + "description": "If present, match VNF instances that belong to VNF products with certain VNFD versions, a certain software version and a certain product name, from one particular provider.\n", + "type": "array", + "items": { + "description": "A version.\n", + "type": "string" + } } } } @@ -113,98 +116,199 @@ } } } + }, + "vnfInstanceIds": { + "description": "If present, match VNF instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfInstanceNames": { + "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } } - }, - "vnfInstanceIds": { - "description": "If present, match VNF instances with an instance identifier listed in this attribute. See note 2.\n", - "type": "array", - "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" + } + }, + "nsInstanceSubscriptionFilter": { + "description": "This type represents subscription filter criteria to match NS instances.\nNOTE 1: The attributes \"nsdIds\", \"vnfdIds\" and \"pnfdIds\" are alternatives to reference to NS instances that are created based on certain NSDs, or contain VNF instances that are based on certain VNFDs, or contain PNFs that are based on certain PNFDs in a filter. They should not be used together in the same filter instance, but one alternative should be chosen.\nNOTE 2: The attributes \"nsInstanceIds\" and \"nsInstanceNames\" are alternatives to reference to particular NS Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n", + "type": "object", + "anyOf": [ + { + "oneOf": [ + { + "required": [ + "nsdIds" + ] + }, + { + "required": [ + "vnfdIds" + ] + }, + { + "required": [ + "pnfdIds" + ] + } + ] + }, + { + "oneOf": [ + { + "required": [ + "nsInstanceIds" + ] + }, + { + "required": [ + "nsInstanceNames" + ] + } + ] } - }, - "vnfInstanceNames": { - "description": "If present, match VNF instances with a VNF Instance Name listed in this attribute. See note 2.\n", - "type": "array", - "items": { - "type": "string" + ], + "properties": { + "nsdIds": { + "description": "If present, match NS instances that were created based on a NSD identified by one of the nsdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "vnfdIds": { + "description": "If present, match NS instances that contain VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "pnfdIds": { + "description": "If present, match NS instances that contain PNFs that are represented by a PNFD identified by one of the pnfdId values listed in this attribute. See note 1.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceIds": { + "description": "If present, match NS instances with an instance identifier listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + } + }, + "nsInstanceNames": { + "description": "If present, match NS instances with a NS Instance Name listed in this attribute. See note 2.\n", + "type": "array", + "items": { + "type": "string" + } } } } - }, - "nsInstanceSubscriptionFilter": { - "description": "This type represents subscription filter criteria to match NS instances.\nNOTE 1: The attributes \"nsdIds\", \"vnfdIds\" and \"pnfdIds\" are alternatives to reference to NS instances that are created based on certain NSDs, or contain VNF instances that are based on certain VNFDs, or contain PNFs that are based on certain PNFDs in a filter. They should not be used together in the same filter instance, but one alternative should be chosen.\nNOTE 2: The attributes \"nsInstanceIds\" and \"nsInstanceNames\" are alternatives to reference to particular NS Instances in a filter. They should not be used both in the same filter instance, but one alternative should be chosen.\n", + } + }, + "tcdaTypes": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", + "type": "array", + "items": { + "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "type": "string", + "enum": [ + "INCIDENT_ANALYSIS", + "HEALTH_ANALYSIS", + "RESOURCE_UTILIZATION_ANALYSIS" + ] + } + }, + "locationAreaFilters": { + "description": "Match Telco-cloud data analytics with location criteria listed in this attribute.\n", + "type": "array", + "items": { + "description": "This type represents subscription filter criteria to match location areas.\n", "type": "object", - "anyOf": [ - { - "oneOf": [ - { - "required": [ - "nsdIds" - ] - }, - { - "required": [ - "vnfdIds" - ] - }, - { - "required": [ - "pnfdIds" - ] - } - ] - }, - { - "oneOf": [ - { - "required": [ - "nsInstanceIds" - ] - }, - { - "required": [ - "nsInstanceNames" - ] - } - ] - } - ], "properties": { - "nsdIds": { - "description": "If present, match NS instances that were created based on a NSD identified by one of the nsdId values listed in this attribute. See note 1.\n", + "countryCode": { + "description": "If present, match location areas with a county code listed in this attribute.\n", + "type": "string" + }, + "civicAddressElements": { + "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", "type": "array", "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" + "type": "object", + "required": [ + "caType", + "caValue" + ], + "properties": { + "caType": { + "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "integer" + }, + "caValue": { + "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", + "type": "string" + } + } } }, - "vnfdIds": { - "description": "If present, match NS instances that contain VNF instances that were created based on a VNFD identified by one of the vnfdId values listed in this attribute. See note 1.\n", + "area": { + "description": "If present, match location areas with a Geographic area listed in this attribute. NOTE: The attributes \"civicAddressElement\" and \"area\" are alternatives to reference to particular location in a filter. \n They should not be used both in the same filter instance, but one alternative should be chosen.\n", "type": "array", "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" + "description": "GeoJSon geometry. See IETF RFC 7946.\n", + "type": "object", + "required": [ + "coordinates" + ], + "properties": { + "coordinates": { + "type": "array", + "items": { + "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", + "type": "array", + "minItems": 4, + "items": { + "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", + "type": "array", + "minItems": 2, + "maxItems": 3, + "items": { + "type": "number" + } + } + } + } + } } }, - "pnfdIds": { - "description": "If present, match NS instances that contain PNFs that are represented by a PNFD identified by one of the pnfdId values listed in this attribute. See note 1.\n", + "resourceZoneIds": { + "description": "If present, match location areas with resource zone identifiers listed in this attribute.\n", "type": "array", "items": { "description": "An identifier with the intention of being globally unique\n", "type": "string" } }, - "nsInstanceIds": { - "description": "If present, match NS instances with an instance identifier listed in this attribute. See note 2.\n", + "cisClusterIds": { + "description": "If present, match location areas with CIS cluster identifiers listed in this attribute.\n", "type": "array", "items": { "description": "An identifier with the intention of being globally unique\n", "type": "string" } }, - "nsInstanceNames": { - "description": "If present, match NS instances with a NS Instance Name listed in this attribute. See note 2.\n", + "containerNamespaces": { + "description": "If present, match location areas with container namespaces listed in this attribute.\n", "type": "array", "items": { "type": "string" @@ -213,136 +317,35 @@ } } } - }, - "tcdaTypes": { - "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", - "type": "array", - "items": { - "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", - "type": "string", - "enum": [ - "INCIDENT_ANALYSIS", - "HEALTH_ANALYSIS", - "RESOURCE_UTILIZATION_ANALYSIS" - ] - } - }, - "locationAreaFilters": { - "description": "Match Telco-cloud data analytics with location criteria listed in this attribute.\n", - "type": "array", - "items": { - "description": "This type represents subscription filter criteria to match location areas.\n", + } + }, + "callbackUri": { + "description": "String formatted according to IETF RFC 3986.\n", + "type": "string" + }, + "_links": { + "description": "TLinks to resources related to this resource.\n", + "type": "object", + "required": [ + "self" + ], + "properties": { + "self": { + "description": "This type represents a link to a resource.\n", "type": "object", + "required": [ + "href" + ], "properties": { - "countryCode": { - "description": "If present, match location areas with a county code listed in this attribute.\n", - "type": "string" - }, - "civicAddressElements": { - "description": "Match Telco-cloud data analytics with Telco-cloud data analytics type listed in this attribute.\n", - "type": "array", - "items": { - "type": "object", - "required": [ - "caType", - "caValue" - ], - "properties": { - "caType": { - "description": "Describe the content type of caValue. The value of caType shall comply with section 3.4 of IETF RFC 4776.\n", - "type": "integer" - }, - "caValue": { - "description": "Content of civic address element corresponding to the caType. The format caValue shall comply with section 3.4 of IETF RFC 4776.\n", - "type": "string" - } - } - } - }, - "area": { - "description": "If present, match location areas with a Geographic area listed in this attribute. NOTE: The attributes \"civicAddressElement\" and \"area\" are alternatives to reference to particular location in a filter. \n They should not be used both in the same filter instance, but one alternative should be chosen.\n", - "type": "array", - "items": { - "description": "GeoJSon geometry. See IETF RFC 7946.\n", - "type": "object", - "required": [ - "coordinates" - ], - "properties": { - "coordinates": { - "type": "array", - "items": { - "description": "A linear ring is a closed LineString with four or more positions. The first and last positions are equivalent, and they MUST contain identical values; their representation SHOULD also be identical. A linear ring is the boundary of a surface or the boundary of a hole in a surface. A linear ring MUST follow the right-hand rule with respect to the area it bounds, i.e., exterior rings are counterclockwise, and holes are clockwise.\n", - "type": "array", - "minItems": 4, - "items": { - "description": "GeoJSon fundamental geometry construct. A position is an array of numbers. There MUST be two or more elements. The first two elements are longitude and latitude, or easting and northing, precisely in that order and using decimal numbers. Altitude or elevation MAY be included as an optional third element. Implementations SHOULD NOT extend positions beyond three elements because the semantics of extra elements are unspecified and ambiguous. Historically, some implementations have used a fourth element to carry a linear referencing measure (sometimes denoted as \"M\") or a numerical timestamp, but in most situations a parser will not be able to properly interpret these values. The interpretation and meaning of additional elements is beyond the scope of this specification, and additional elements MAY be ignored by parsers.\n", - "type": "array", - "minItems": 2, - "maxItems": 3, - "items": { - "type": "number" - } - } - } - } - } - } - }, - "resourceZoneIds": { - "description": "If present, match location areas with resource zone identifiers listed in this attribute.\n", - "type": "array", - "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" - } - }, - "cisClusterIds": { - "description": "If present, match location areas with CIS cluster identifiers listed in this attribute.\n", - "type": "array", - "items": { - "description": "An identifier with the intention of being globally unique\n", - "type": "string" - } - }, - "containerNamespaces": { - "description": "If present, match location areas with container namespaces listed in this attribute.\n", - "type": "array", - "items": { - "type": "string" - } + "href": { + "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", + "type": "string", + "format": "url" } } } } } - }, - "callbackUri": { - "description": "String formatted according to IETF RFC 3986.\n", - "type": "string" - }, - "_links": { - "description": "TLinks to resources related to this resource.\n", - "type": "object", - "required": [ - "self" - ], - "properties": { - "self": { - "description": "This type represents a link to a resource.\n", - "type": "object", - "required": [ - "href" - ], - "properties": { - "href": { - "description": "URI of another resource referenced from a resource. Shall be an absolute URI (i.e. a URI that contains {apiRoot}).\n", - "type": "string", - "format": "url" - } - } - } - } } } } \ No newline at end of file -- GitLab From 3746e2148485c83328654fbb96c674f8274b6016 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Mon, 29 Dec 2025 15:36:18 +0100 Subject: [PATCH 09/27] [test-new][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.5.x Test-IDs] Implemented new tests for Telco Data Analytics individial subscriptions --- .../DataAnalyticsOperationKeywords.robot | 2 +- .../IndividualSubscription.robot | 123 ++++++++++++++++++ 2 files changed, 124 insertions(+), 1 deletion(-) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/IndividualSubscription.robot diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index 0bf5ee16..df2b41bb 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -2,7 +2,7 @@ *** Settings *** Resource environment/variables.txt Library MockServerLibrary -Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=falseLibrary +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=falseLibrary Library BuiltIn Library JSONLibrary Library Collections diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualSubscription.robot b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualSubscription.robot new file mode 100644 index 00000000..88bc1598 --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualSubscription.robot @@ -0,0 +1,123 @@ +*** Settings *** +Library JSONSchemaLibrary schemas/ +Resource environment/variables.txt +Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false +Library OperatingSystem +Library JSONLibrary +Resource DataAnalyticsOperationKeywords.robot + +*** Test Cases *** +GET Individual Subscription + [Documentation] Test ID: 12.3.1.5.1 + ... Test title: GET Individual Subscription + ... Test objective: The objective is to test the retrieval of individual subscription and perform a JSON schema and content validation of the returned subscription data structure + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Subscription + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscription + Check HTTP Response Body Subscription Identifier matches the requested Subscription + +GET Individual Subscription - invalid resource identifier + [Documentation] Test ID: 12.3.1.5.2 + ... Test title: GET Individual Subscription - invalid resource identifier + ... Test objective: The objective is to test that the retrieval of an individual subscription fails when using an invalid resource identifier + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + GET individual Subscription with invalid resource identifier + Check HTTP Response Status Code Is 404 + +DELETE Individual Subscription + [Documentation] Test ID: 12.3.1.5.3 + ... Test title: DELETE Individual Subscription + ... Test objective: The objective is to test the deletion of an individual subscription + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: The resource is not available anymore in the Telco-Cloud DAF + Send Delete request for individual Subscription + Check HTTP Response Status Code Is 204 + Check Postcondition Subscription is Deleted + +DELETE Individual Subscription - invalid resource identifier + [Documentation] Test ID: 12.3.1.5.4 + ... Test title: DELETE Individual Subscription - invalid resource identifier + ... Test objective: The objective is to test that the deletion of an individual subscription fails when using an invalid resource identifier + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.5 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Delete request for individual Subscription with invalid resource identifier + Check HTTP Response Status Code Is 404 + +POST Individual Subscription - Method not implemented + [Documentation] Test ID: 12.3.1.5.5 + ... Test title: POST Individual Subscription - Method not implemented + ... Test objective: The objective is to test that POST method is not allowed to create a new Subscription + ... Pre-conditions: none + ... Reference: clause 5.5.7.3.1 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Post request for individual Subscription + Check HTTP Response Status Code Is 405 + +PUT Individual Subscription - Method not implemented + [Documentation] Test ID: 12.3.1.5.6 + ... Test title: PUT Individual Subscription - Method not implemented + ... Test objective: The objective is to test that PUT method is not allowed to update an existing subscription + ... Pre-conditions: none + ... Reference: clause 5.5.7.3.3 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Put request for individual Subscription + Check HTTP Response Status Code Is 405 + +PATCH Individual Subscription - Method not implemented + [Documentation] Test ID: 12.3.1.5.7 + ... Test title: PATCH Individual Subscription - Method not implemented + ... Test objective: The objective is to test that PATCH method is not allowed to modify an existing subscription + ... Pre-conditions: none + ... Reference: clause 5.5.7.3.4 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Send Patch request for individual Subscription + Check HTTP Response Status Code Is 405 + +GET Individual Subscription with permitted authorization scope + [Documentation] Test ID: 12.3.1.5.8 + ... Test title: GET Individual Subscription with permitted authorization scope + ... Test objective: The objective is to test the retrieval of individual subscription when a permitted authorization scope is used. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Subscription with permitted authorization scope + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscription + Check HTTP Response Body Subscription Identifier matches the requested Subscription + +GET Individual Subscription with not permitted authorization scope + [Documentation] Test ID: 12.3.1.5.9 + ... Test title: GET Individual Subscription with not permitted authorization scope + ... Test objective: The objective is to test the retrieval of individual subscription fails when a not permitted authorization scope is used. + ... Pre-conditions: At least one subscription is available in the Telco-Cloud DAF. + ... Reference: clause 5.5.7.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 + ... Config ID: Config_prod_NFV-MANO + ... Applicability: none + ... Post-Conditions: none + Get Individual Subscription with not permitted authorization scope + Check HTTP Response Status Code Is 200 + Check HTTP Response Body Json Schema Is AnalyticsSubscription + Check HTTP Response Body Subscription Identifier matches the requested Subscription \ No newline at end of file -- GitLab From eff570342c74168f20867d5d8d4eb68a1dae63cf Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Fri, 2 Jan 2026 12:27:19 +0000 Subject: [PATCH 10/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.2.4,8 Test-IDs] Fix response codes --- .../IndividualTelco-CloudDataAnalytics.robot | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot index 74464449..4de09405 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/IndividualTelco-CloudDataAnalytics.robot @@ -55,7 +55,7 @@ GET Information about an Individual Telco-Cloud data Analytics with permitted au ... Applicability: none ... Post-Conditions: none GET Individual Telco-Cloud data Analytics with permitted authorization scope - Check HTTP Response Status Code Is 201 + Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is individualTelcoCloudAnalytics GET Information about an Individual Telco-Cloud data Analytics with not permitted authorization scope [Documentation] Test ID: 12.3.1.2.5 @@ -73,7 +73,7 @@ GET Information about an Individual Telco-Cloud data Analytics with not permitte GET Information about an Individual Telco-Cloud data Analytics - Unauthorized [Documentation] Test ID: 12.3.1.2.6 ... Test title: GET Information about an Individual Telco-Cloud data Analytics without authorization - ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics without authprization + ... Test objective: The objective is to GET Information about an Individual Telco-Cloud data Analytics without authorization ... Pre-conditions: none ... Reference: Clause 5.5.4.3.2 - ETSI GS NFV-SOL 025 [12] v5.2.1 ... Config ID: config_prod_NFV-MANO @@ -105,7 +105,7 @@ PATCH Individual Telco-Cloud data Analytics ... Applicability: none ... Post-Conditions: Telco-Cloud data Analytics modified PATCH Individual Telco-Cloud data Analytics - Check HTTP Response Status Code Is 202 + Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is telcoCloudAnalyticsModifications PATCH Individual Telco-Cloud data Analytics - UNPROCESSABLE CONTENT -- GitLab From ed5933e8b28833b4dcf3acb9cf078fb25f1f7f0d Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Fri, 2 Jan 2026 12:31:22 +0000 Subject: [PATCH 11/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.x Test-IDs] Fix editorial issues and add Authorization --- SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot | 8 ++++---- .../DataAnalyticsOperationKeywords.robot | 1 + .../schemas/telcoCloudAnalyticsReport.schema.json | 4 ++-- 3 files changed, 7 insertions(+), 6 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot index d091162a..45f4937c 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot @@ -112,7 +112,7 @@ GET information about Analytics Bad Request Invalid attribute selector GET Analytics with bad filter Check HTTP Response Status Code Is 400 Check HTTP Response Body Json Schema Is ProblemDetails -GET information about Analytics with "all_fields" attribute selector +GET information about Analytics with all_fields attribute selector [Documentation] Test ID: 12.3.1.1.9 ... Test title: GET information about Analytics with "all_fields" attribute selector ... Test objective: The objective is to query information about Analytics @@ -124,7 +124,7 @@ GET information about Analytics with "all_fields" attribute selector GET Analytics with all_fields attribute selector Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is telcoCloudAnalytics -GET information about Analytics with "exclude_default" attribute selector +GET information about Analytics with exclude_default attribute selector [Documentation] Test ID: 12.3.1.1.10 ... Test title: GET information about Analytics with "exclude_default" attribute selector ... Test objective: The objective is to query information about Analytics @@ -138,7 +138,7 @@ GET information about Analytics with "exclude_default" attribute selector Check HTTP Response Body Json Schema Is telcoCloudAnalytics Check Response should not Contains reports -GET information about Analytics with "fields" attribute selector +GET information about Analytics with fields attribute selector [Documentation] Test ID: 12.3.1.1.11 ... Test title: GET information about Analytics with "fields" attribute selector ... Test objective: The objective is to query information about Analytics @@ -151,7 +151,7 @@ GET information about Analytics with "fields" attribute selector Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is telcoCloudAnalytics -GET information about Analytics with "exclude_fields" attribute selector +GET information about Analytics with exclude_fields attribute selector [Documentation] Test ID: 12.3.1.1.12 ... Test title: GET information about Analytics with "exclude_fields" attribute selector ... Test objective: The objective is to query information about Analytics diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index df2b41bb..f3d84f2a 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -313,6 +313,7 @@ Get Individual Telco-Cloud data Analytics report Set Headers {"Accept":"${ACCEPT}"} Set Headers {"Version": "${API_VERSION}"} Set Headers {"Content-Type": "${CONTENT_TYPE}"} + Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} Get ${apiRoot}/${apiName}/${apiMajorVersion}/analytics/${analyticsId}/reports/${reportId} ${outputResponse}= Output response Set Global Variable ${response} ${outputResponse} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json index 3066de21..3dd988ce 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json @@ -23,7 +23,7 @@ "type": "object", "properties": { "outputForIncidentAnalysis": { - "description": "This type represents the specific output contained in a Telco-cloud data analytics report when the value of “tcdaType” in TelcoCloudAnalytics is INCIDENT_ANALYSIS. To enable Telco-cloud data analytics with type INCIDENT_ANALYSIS, the enabling data may be used by Telco-cloud DAF are provided in table A.2.\n", + "description": "This type represents the specific output contained in a Telco-cloud data analytics report when the value of \"tcdaType\" in TelcoCloudAnalytics is INCIDENT_ANALYSIS. To enable Telco-cloud data analytics with type INCIDENT_ANALYSIS, the enabling data may be used by Telco-cloud DAF are provided in table A.2.\n", "type": "object", "required": [ "incidentSourceObjects", @@ -41,7 +41,7 @@ } }, "faultType": { - "description": "Indicates the type of source fault that has caused the incident. Valid values map to “Event type” values or \"Alarm definition identifier\" values of the Alarm as defined in ETSI GS NFV-IFA 045. \n", + "description": "Indicates the type of source fault that has caused the incident. Valid values map to \"Event type\" values or \"Alarm definition identifier\" values of the Alarm as defined in ETSI GS NFV-IFA 045. \n", "type": "string" }, "eventTime": { -- GitLab From 3918cf4998b8d68dd7a43a3b9531b70f8c0be911 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Wed, 7 Jan 2026 05:58:08 +0000 Subject: [PATCH 12/27] [datamodel-upd][SOL025][DATA-ANALYTICS][ v5.2.1] Align DateTime example with RFC3339 format --- .../jsons/dataAnalyticsRequest.json | 2 +- .../jsons/telcoCloudAnalyticsModifications.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json index d53a1d02..5821b09a 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/dataAnalyticsRequest.json @@ -2,7 +2,7 @@ "tcdaType": "INCIDENT_ANALYSIS", "controlAttributes": { "analyticsCollectionInterval": { - "startTime": "date-time" + "startTime": "2024-11-30T10:15:30.52Z" }, "objectType": "VNF" } diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json index 054cfee3..44c286a1 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json @@ -1,6 +1,6 @@ {{ "analyticsCollectionInterval": { - "startTime": "date-time" + "startTime": "2024-11-30T10:15:30.52Z" }, "locationAreaInfo": [ { -- GitLab From 0d9060546d716270ecaf24f44f2016502b349c9b Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Wed, 7 Jan 2026 06:26:22 +0000 Subject: [PATCH 13/27] [datamodel-upd][SOL025][DATA-ANALYTICS][ v5.2.1][12.3.1.1.x-12.3.1.2.x Test-IDs] Update description of attribute "analyticsId" --- .../schemas/individualTelcoCloudAnalytics.schema.json | 2 +- .../schemas/telcoCloudAnalytics.schema.json | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json index 0decc02c..1d3dea23 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json @@ -9,7 +9,7 @@ ], "properties": { "analyticsId": { - "description": "An identifier with the intention of being globally unique\n", + "description": "The identifier generated by the Telco-cloud DAF used to identify the Telco-cloud data analytics process. This identifier is later used in the associated notification informing about the data analytics process.\n", "type": "string" }, "tcdaType": { diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json index cc66c11a..21a8b3c8 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json @@ -11,7 +11,7 @@ ], "properties": { "analyticsId": { - "description": "An identifier with the intention of being globally unique\n", + "description": "The identifier generated by the Telco-cloud DAF used to identify the Telco-cloud data analytics process. This identifier is later used in the associated notification informing about the data analytics process.\n", "type": "string" }, "tcdaType": { -- GitLab From 1d8dd0f7f7b4339792438764e2e1095a3c42bb00 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Wed, 7 Jan 2026 16:38:31 +0100 Subject: [PATCH 14/27] [fix-test][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.7.1 Test-IDs] Fixed DataAnalyticsChangeNotification exemplary json attribute values to address Kuno-san comments --- .../jsons/DataAnalyticsChangeNotification.json | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json index b0121303..ff3b5d78 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/DataAnalyticsChangeNotification.json @@ -1,12 +1,13 @@ {{ - "id": "", + "id": "bb153807-4b5d-473a-b5b9-9591f0baf23c", "notificationType": "DataAnalyticsChangeNotification", "analyticsId": "{analyticsId}", - "timeStamp": "", - "notificationStatus": "", - "analysisStatus": "", - "failureReason": "", + "timeStamp": ""2026-01-15T15:21:48.52Z"", + "notificationStatus": "RESULT", + "analysisStatus": "FAILED", + "failureReason": "lack of resources", "_links": {{ - "analytics": "" + "analytics": { + "href": "http://localhost" }} }} \ No newline at end of file -- GitLab From ab769e11193c9c6e7330a003500f110469f80465 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Wed, 7 Jan 2026 16:40:48 +0100 Subject: [PATCH 15/27] [fix-test][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Fixed AnalyticsSubscription json schema to address Kuno-san comments --- .../schemas/AnalyticsSubscription.schema.json | 4 +++- .../schemas/AnalyticsSubscriptions.schema.json | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json index 326d5f45..f14e8ac9 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscription.schema.json @@ -2,6 +2,7 @@ "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", "type": "object", "required": [ + "id", "callbackUri" ], "properties": { @@ -319,7 +320,8 @@ }, "callbackUri": { "description": "String formatted according to IETF RFC 3986.\n", - "type": "string" + "type": "string", + "format": "url" }, "_links": { "description": "TLinks to resources related to this resource.\n", diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json index 5a12a639..a6961eb5 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/AnalyticsSubscriptions.schema.json @@ -4,6 +4,7 @@ "description": "This type represents a subscription related to notifications about Telco-cloud data analytics change.\n", "type": "object", "required": [ + "id", "callbackUri" ], "properties": { @@ -321,7 +322,8 @@ }, "callbackUri": { "description": "String formatted according to IETF RFC 3986.\n", - "type": "string" + "type": "string", + "format": "url" }, "_links": { "description": "TLinks to resources related to this resource.\n", -- GitLab From e36f56e383254cb911a8c845e8a6beb3bd82ee4f Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Wed, 7 Jan 2026 16:41:21 +0100 Subject: [PATCH 16/27] [fix-test][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Added missing DataAnalyticsChangeNotification json schema file --- ...ataAnalyticsChangeNotification.schema.json | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 SOL025/TelcoCloudDataAnalyticsService-API/schemas/DataAnalyticsChangeNotification.schema.json diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/DataAnalyticsChangeNotification.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/DataAnalyticsChangeNotification.schema.json new file mode 100644 index 00000000..d12f8aea --- /dev/null +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/DataAnalyticsChangeNotification.schema.json @@ -0,0 +1,92 @@ +{ + "description": "This notification informs the receiver of events related to Telco-cloud data analytics processing. This notification is produced by the Telco-cloud DAF when there is an event caused by the Telco-cloud data analytics process, e.g. the result of the Telco-cloud data analytics (i.e. availability of a corresponding Telco-cloud data analytics report). If this is a notification about the start of a Telco-cloud data analytics process, the notification shall be sent before any action (including sending the input information collection requests for Telco-cloud data analytics purpose) is taken, however, after acknowledging the Telco-cloud data analytics request to the Telco-cloud DAF Consumer. If this is a notification about the result of a Telco-cloud data analytics process, the notification shall be sent after all other actions of the Telco-cloud data analytics have been executed. This notification can also be raised in case of an unsuccessful Telco-cloud data analytics process to provide appropriate error information.\n", + "type": "object", + "required": [ + "id", + "notificationType", + "timeStamp", + "analyticsId", + "notificationStatus", + "analysisStatus", + "_links" + ], + "properties": { + "id": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "notificationType": { + "description": "Discriminator for the different notification types. Shall be set to \"DataAnalyticsChangeNotification\" for this notification type.\n", + "type": "string", + "enum": [ + "DataAnalyticsChangeNotification" + ] + }, + "timeStamp": { + "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "format": "date-time" + }, + "analyticsId": { + "description": "An identifier with the intention of being globally unique\n", + "type": "string" + }, + "notificationStatus": { + "description": "Indicates whether this notification reports about the start or the result of a data analytics process. Permitted values:: -\tSTART: Informs about the start of the data analytics -\tRESULT: Informs about the result of the data analytics\n", + "type": "string", + "enum": [ + "START", + "RESULT" + ] + }, + "analysisStatus": { + "description": "Indicates the analysis status. Permitted values: -\tPROCESSING: The Telco-cloud data analytics process is currently in execution. -\tCOMPLETED: The Telco-cloud data analytics process has been completed successfully. -\tFAILED: The Telco-cloud data analytics process is failed and determined that it will not succeed.\n", + "type": "string", + "enum": [ + "PROCESSING", + "COMPLETED", + "FAILED" + ] + }, + "failureReason": { + "description": "Indicates the failure reason for a Telco-cloud data analytics process, e.g., lack of resources. Shall be present in case the \"analysisStatus\" is set to \"FAILED\".\n", + "type": "string" + }, + "_links": { + "description": "Links to resources related to this notification.\n", + "type": "object", + "required": [ + "analytics" + ], + "properties": { + "analytics": { + "description": "This type represents a link to a resource in a notification, using an absolute or relative URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of a resource referenced from a notification. Should be an absolute URI (i.e. a URI that contains {apiRoot}), however, may be a relative URI (i.e. a URI where the {apiRoot} part is omitted) if the {apiRoot} information is not available.\n", + "type": "string", + "format": "url" + } + } + }, + "analyticsReport": { + "description": "This type represents a link to a resource in a notification, using an absolute or relative URI.\n", + "type": "object", + "required": [ + "href" + ], + "properties": { + "href": { + "description": "URI of a resource referenced from a notification. Should be an absolute URI (i.e. a URI that contains {apiRoot}), however, may be a relative URI (i.e. a URI where the {apiRoot} part is omitted) if the {apiRoot} information is not available.\n", + "type": "string", + "format": "url" + } + } + } + } + } + } +} \ No newline at end of file -- GitLab From a1df229c876687cf9ba043169627d45d68d77e5d Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Thu, 8 Jan 2026 06:15:20 +0000 Subject: [PATCH 17/27] [fix-test][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Fix telcoCloudAnalytics json schema --- .../schemas/individualTelcoCloudAnalytics.schema.json | 3 ++- .../schemas/telcoCloudAnalytics.schema.json | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json index 1d3dea23..6afebece 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json @@ -142,7 +142,8 @@ "properties": { "href": { "description": "String formatted according to IETF RFC 3986.\n", - "type": "string" + "type": "string", + "format": "url" }, "readyTime": { "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json index 21a8b3c8..f9abec73 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json @@ -144,7 +144,8 @@ "properties": { "href": { "description": "String formatted according to IETF RFC 3986.\n", - "type": "string" + "type": "string", + "format": "url" }, "readyTime": { "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", -- GitLab From 8537696cd2f705c9060e3424016cb7ea624fd197 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Thu, 8 Jan 2026 10:30:23 +0000 Subject: [PATCH 18/27] [fix-test][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Fix description of attributes as per SOL Specs --- .../schemas/individualTelcoCloudAnalytics.schema.json | 10 +++++----- .../schemas/telcoCloudAnalytics.schema.json | 10 +++++----- .../telcoCloudAnalyticsModifications.schema.json | 4 ++-- 3 files changed, 12 insertions(+), 12 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json index 6afebece..34f56e15 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/individualTelcoCloudAnalytics.schema.json @@ -13,7 +13,7 @@ "type": "string" }, "tcdaType": { - "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "description": "The type of a Telco-cloud data analytics.\n", "type": "string", "enum": [ "INCIDENT_ANALYSIS", @@ -29,11 +29,11 @@ ], "properties": { "startTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "First date and time of the interval. See note.\n", "format": "date-time" }, "endTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "Second date and time of the interval. Shall be present when a time interval is provided, and absent otherwise. When provided, the endTime shall be greater than startTime. See note.\n", "format": "date-time" } } @@ -146,11 +146,11 @@ "format": "url" }, "readyTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "The time when the report was made available.\n", "format": "date-time" }, "expiryTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "The time when the report will expire.\n", "format": "date-time" }, "fileSize": { diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json index f9abec73..64e4caf2 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalytics.schema.json @@ -15,7 +15,7 @@ "type": "string" }, "tcdaType": { - "description": "INCIDENT_ANALYSIS: The type of a Telco-cloud data analytics is incident analysis. HEALTH_ANALYSIS: The type of a Telco-cloud data analytics is health analysis. RESOURCE_UTILIZATION_ANALYSIS: The type of a Telco-cloud data analytics is resource utilization analysis.\n", + "description": "The type of a Telco-cloud data analytics.\n", "type": "string", "enum": [ "INCIDENT_ANALYSIS", @@ -31,11 +31,11 @@ ], "properties": { "startTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "First date and time of the interval. See note.\n", "format": "date-time" }, "endTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "Second date and time of the interval. Shall be present when a time interval is provided, and absent otherwise. When provided, the endTime shall be greater than startTime. See note.\n", "format": "date-time" } } @@ -148,11 +148,11 @@ "format": "url" }, "readyTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "The time when the report was made available.\n", "format": "date-time" }, "expiryTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "The time when the report will expire.\n", "format": "date-time" }, "fileSize": { diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json index 212bf94a..ca1b4635 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsModifications.schema.json @@ -22,11 +22,11 @@ ], "properties": { "startTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "First date and time of the interval. See note.\n", "format": "date-time" }, "endTime": { - "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", + "description": "Second date and time of the interval. Shall be present when a time interval is provided, and absent otherwise. When provided, the endTime shall be greater than startTime. See note.\n", "format": "date-time" } } -- GitLab From 9d75b589ce772f48416bdd34e19d342e04311cc0 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Thu, 8 Jan 2026 12:02:00 +0000 Subject: [PATCH 19/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.9 Test-ID] Add a check for all_fields attribute selector --- SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot | 1 + .../DataAnalyticsOperationKeywords.robot | 7 +++++++ 2 files changed, 8 insertions(+) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot index 45f4937c..ba2c2ac6 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot @@ -124,6 +124,7 @@ GET information about Analytics with all_fields attribute selector GET Analytics with all_fields attribute selector Check HTTP Response Status Code Is 200 Check HTTP Response Body Json Schema Is telcoCloudAnalytics + Check Response should Contains reports GET information about Analytics with exclude_default attribute selector [Documentation] Test ID: 12.3.1.1.10 ... Test title: GET information about Analytics with "exclude_default" attribute selector diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index f3d84f2a..62fe0b8e 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -412,6 +412,13 @@ Check HTTP Response Body Json Schema Is ${schema} = Catenate SEPARATOR= ${input} .schema.json Validate Json ${schema} ${response['body']} Log Json Schema Validation OK +Check Response should Contains + [Arguments] ${argument} + ${body}= Set Variable ${response['body']} + ${first_item}= Get From List ${body} 0 + Dictionary Should Contain Key ${first_item} ${argument} + Log ${argument} attribute is present in the response + ## Subscriptions Get all Subscriptions -- GitLab From b13fed71e1aa24f5b782930c3b83182deeef9cd7 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Fri, 9 Jan 2026 11:49:44 +0000 Subject: [PATCH 20/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.11-12 Test-IDs] Update Testcases for field and exclude_field query param --- .../DataAnalyticsOperationKeywords.robot | 8 ++++++-- .../environment/variables.txt | 4 +++- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index 62fe0b8e..47da8184 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -144,7 +144,9 @@ GET Analytics with fields attribute selector Set Headers {"Accept": "${ACCEPT_JSON}"} Set Headers {"Version": "${API_VERSION}"} Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} - GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields + ${field_param}= Evaluate ",".join($requested_fields) + Log Querying Analytics using fields selector: ${field_param} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields=${field_param} ${output}= Output response Set Suite Variable ${response} ${output} GET Analytics with exclude_fields attribute selector @@ -152,7 +154,9 @@ GET Analytics with exclude_fields attribute selector Set Headers {"Accept": "${ACCEPT_JSON}"} Set Headers {"Version": "${API_VERSION}"} Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} - GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_fields + ${field_param}= Evaluate ",".join($excluded_fields) + Log Querying Analytics using exclude_fields selector: ${field_param} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_fields=${field_param} ${output}= Output response Set Suite Variable ${response} ${output} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt index 4bf987ff..b85c5943 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt +++ b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt @@ -51,4 +51,6 @@ ${polling_interval} 10 sec ${notification_request} [] ${notification_response} [] -${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies.jar \ No newline at end of file +${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies.jar +@{requested_fields}= analyticsId tcdaType analyticsCollectionInterval +@{excluded_fields}= objectInstanceId reports \ No newline at end of file -- GitLab From 0d31d416216b981c265b3e6d3c5cc726cf78e6f0 Mon Sep 17 00:00:00 2001 From: Eisha Date: Mon, 12 Jan 2026 20:53:26 +0500 Subject: [PATCH 21/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.11-12 Test-IDs] Fix Query-Param --- .../DataAnalyticsOperationKeywords.robot | 8 ++------ .../environment/variables.txt | 3 +-- 2 files changed, 3 insertions(+), 8 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index 47da8184..08730b54 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -144,9 +144,7 @@ GET Analytics with fields attribute selector Set Headers {"Accept": "${ACCEPT_JSON}"} Set Headers {"Version": "${API_VERSION}"} Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} - ${field_param}= Evaluate ",".join($requested_fields) - Log Querying Analytics using fields selector: ${field_param} - GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields=${field_param} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields=${requested_fields} ${output}= Output response Set Suite Variable ${response} ${output} GET Analytics with exclude_fields attribute selector @@ -154,9 +152,7 @@ GET Analytics with exclude_fields attribute selector Set Headers {"Accept": "${ACCEPT_JSON}"} Set Headers {"Version": "${API_VERSION}"} Run Keyword If ${AUTH_USAGE} == 1 Set Headers {"${AUTHORIZATION_HEADER}":"${AUTHORIZATION_TOKEN}"} - ${field_param}= Evaluate ",".join($excluded_fields) - Log Querying Analytics using exclude_fields selector: ${field_param} - GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_fields=${field_param} + GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?exclude_fields=${requested_fields} ${output}= Output response Set Suite Variable ${response} ${output} diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt index b85c5943..5a64ab07 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt +++ b/SOL025/TelcoCloudDataAnalyticsService-API/environment/variables.txt @@ -52,5 +52,4 @@ ${notification_request} [] ${notification_response} [] ${MOCK_SERVER_JAR} ../../../bin/mockserver-netty-5.5.0-jar-with-dependencies.jar -@{requested_fields}= analyticsId tcdaType analyticsCollectionInterval -@{excluded_fields}= objectInstanceId reports \ No newline at end of file +${requested_fields}= reports \ No newline at end of file -- GitLab From a88e24307e04838774d92590c3ad055a91753be6 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 12 Jan 2026 20:56:46 +0500 Subject: [PATCH 22/27] [data-model-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Update telcoCloudAnalyticsModification.json --- .../jsons/telcoCloudAnalyticsModifications.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json index 44c286a1..0c74ec87 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/jsons/telcoCloudAnalyticsModifications.json @@ -4,7 +4,7 @@ }, "locationAreaInfo": [ { - "countryCode" : "String" + "countryCode" : "FR" } ] }} \ No newline at end of file -- GitLab From c77e3b31a454743aebdd02a50a40e5dca155062b Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Mon, 12 Jan 2026 21:10:29 +0500 Subject: [PATCH 23/27] [data-model-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.x.y Test-IDs] Update telcoCloudAnalyticsReport --- .../schemas/telcoCloudAnalyticsReport.schema.json | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json index 3dd988ce..390f8647 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json +++ b/SOL025/TelcoCloudDataAnalyticsService-API/schemas/telcoCloudAnalyticsReport.schema.json @@ -16,7 +16,8 @@ }, "reportGenerationTime": { "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", - "format": "date-time" + "format": "date-time", + "type": "string" }, "outputPerTcdaType": { "description": "This type represents the output contained in a Telco-cloud data analytics report.\n", @@ -46,7 +47,8 @@ }, "eventTime": { "description": "Date-time stamp. Representation: String formatted according toas defined by the date-time production in IETF RFC 3339.\n", - "format": "date-time" + "format": "date-time", + "type": "string" }, "issueId": { "description": "Holds the identifier of the reported incident.\n", -- GitLab From 1c98c04a950d2b052de2d82ed42ac10528e03036 Mon Sep 17 00:00:00 2001 From: Eisha Ayaz Date: Wed, 14 Jan 2026 11:28:57 +0500 Subject: [PATCH 24/27] [test-upd][SOL025][DATA-ANALYTICS][v5.2.1][12.3.1.1.11-12 Test-IDs] Fix Query-Param --- .../Analytics.robot | 3 +- .../DataAnalyticsOperationKeywords.robot | 38 +++++++++++++++++++ 2 files changed, 39 insertions(+), 2 deletions(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot index ba2c2ac6..5a6aa7c7 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Analytics.robot @@ -150,8 +150,7 @@ GET information about Analytics with fields attribute selector ... Post-Conditions: none GET Analytics with fields attribute selector Check HTTP Response Status Code Is 200 - Check HTTP Response Body Json Schema Is telcoCloudAnalytics - + Validate Fields Selector Transformation ${requested_fields} GET information about Analytics with exclude_fields attribute selector [Documentation] Test ID: 12.3.1.1.12 ... Test title: GET information about Analytics with "exclude_fields" attribute selector diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot index 08730b54..7fc11d5a 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/DataAnalyticsOperationKeywords.robot @@ -147,6 +147,44 @@ GET Analytics with fields attribute selector GET ${apiRoot}/${apiName}/${apiMajorVersion}/analytics?fields=${requested_fields} ${output}= Output response Set Suite Variable ${response} ${output} +Validate Fields Selector Transformation + [Arguments] ${requested_fields} + ${selectable_fields}= Create List reports locationAreaInfo + ${requested_set}= Evaluate set(${requested_fields}) + ${absent_fields}= Evaluate list(set(${selectable_fields}) - ${requested_set}) + ${body}= Set Variable ${response['body']} + ${body_length}= Get Length ${body} + + # Early return if body is empty + Return From Keyword If ${body_length} == 0 + + # Validate each item + FOR ${item} IN @{body} + Validate Single Item ${item} ${requested_fields} ${absent_fields} + END + + Log Fields selector transformation validated for requested: ${requested_fields} + +Validate Single Item + [Arguments] ${item} ${requested_fields} ${absent_fields} + Check Fields Present ${item} ${requested_fields} + Check Fields Absent ${item} ${absent_fields} + +Check Fields Present + [Arguments] ${item} ${fields} + ${count}= Get Length ${fields} + Return From Keyword If ${count} == 0 + FOR ${field} IN @{fields} + Dictionary Should Contain Key ${item} ${field} + END + +Check Fields Absent + [Arguments] ${item} ${fields} + ${count}= Get Length ${fields} + Return From Keyword If ${count} == 0 + FOR ${field} IN @{fields} + Dictionary Should Not Contain Key ${item} ${field} + END GET Analytics with exclude_fields attribute selector Log Query information about Analytics using exclude_fields attribute selector Set Headers {"Accept": "${ACCEPT_JSON}"} -- GitLab From bd70a73aeff16378f0fd880334ed476b6a22d212 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Fri, 16 Jan 2026 13:06:46 +0100 Subject: [PATCH 25/27] added new SOL025 index file for generation of electronic attachments --- indexes/sol_025_index.csv | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 indexes/sol_025_index.csv diff --git a/indexes/sol_025_index.csv b/indexes/sol_025_index.csv new file mode 100644 index 00000000..610aea75 --- /dev/null +++ b/indexes/sol_025_index.csv @@ -0,0 +1,10 @@ +12, Telco Cloud Data Analytics Service Reference Point, SOL025 +12.3.1,Telco-cloud Data Analytics Service Interface, TelcoCloudDataAnalyticsService-API +12.3.1.1,Analytics Endpoint, Analytics.robot +12.3.1.2,Individual Telco-Cloud data Analytics Endpoint, IndividualTelco-CloudDataAnalytics.robot +12.3.1.3,Individual Telco-cloud data Analytics Report Endpoint, IndividualTelco-cloudDataAnalyticsReport.robot +12.3.1.4,Subscriptions Endpoint, Subscriptions.robot +12.3.1.5,Individual Subscription Endpoint, IndividualSubscription.robot +12.3.1.6,Notifications, Notifications.robot +12.3.1.7,NotificationEndpoint, NotificationEndpoint.robot +12.3.1.8,API Version Endpoint, ApiVersion.robot -- GitLab From 49bdd23fed9d3c62ffb2d29e02bfd606fc781676 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Fri, 16 Jan 2026 13:08:33 +0100 Subject: [PATCH 26/27] added README --- SOL025/README.md | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 SOL025/README.md diff --git a/SOL025/README.md b/SOL025/README.md new file mode 100644 index 00000000..c5e2faeb --- /dev/null +++ b/SOL025/README.md @@ -0,0 +1,3 @@ +# NFV API Tests + +This folder includes the NFV API conformance test descriptions for NFV SOL025 APIs. -- GitLab From a61ee810e96da3b1add2d8defa4e353cc72b2810 Mon Sep 17 00:00:00 2001 From: "g.bernini" Date: Fri, 16 Jan 2026 16:15:32 +0100 Subject: [PATCH 27/27] removed blank space in 1 robot file --- SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot b/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot index fe408ada..4c925240 100644 --- a/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot +++ b/SOL025/TelcoCloudDataAnalyticsService-API/Subscriptions.robot @@ -1,6 +1,6 @@ *** Settings *** Library JSONSchemaLibrary schemas/ -Resource environment/variables.txt +Resource environment/variables.txt Library REST ${TCDAS_SCHEMA}://${TCDAS_HOST}:${TCDAS_PORT} ssl_verify=false Library OperatingSystem Library JSONLibrary -- GitLab