This is an automated email from the ASF dual-hosted git repository.
ericholguin pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/trafficcontrol.git
The following commit(s) were added to refs/heads/master by this push:
new e0798b0e50 Added Api contract test case for delivery services sslkeys
generate endpoint (#7651)
e0798b0e50 is described below
commit e0798b0e50cc462b61c48d9cbd53dc43354e23ca
Author: Gokula Krishnan <[email protected]>
AuthorDate: Wed Jul 19 00:23:29 2023 +0530
Added Api contract test case for delivery services sslkeys generate
endpoint (#7651)
* Added Api contract test case for delivery_service_sslkeys endpoint
* Added Api contract test for delivery_services_sslkeys_generate endpoint
* Added traffic vault to GHA
* Update conftest.py
* Update response_template.json
---
.github/workflows/to.api.contract.tests.yml | 3 +
traffic_ops/testing/api_contract/v4/conftest.py | 30 +++++++++
.../api_contract/v4/data/request_template.json | 13 ++++
.../api_contract/v4/data/response_template.json | 67 +++++++++++++++++++
.../v4/test_delivery_services_sslkeys.py | 76 ++++++++++++++++++++++
5 files changed, 189 insertions(+)
diff --git a/.github/workflows/to.api.contract.tests.yml
b/.github/workflows/to.api.contract.tests.yml
index ae60e60a72..a709289967 100644
--- a/.github/workflows/to.api.contract.tests.yml
+++ b/.github/workflows/to.api.contract.tests.yml
@@ -75,6 +75,9 @@ jobs:
- name: Initialize Traffic Ops Database
id: todb
uses: ./.github/actions/todb-init
+ - name: Initialize Traffic Vault Database
+ id: tvdb
+ uses: ./.github/actions/tvdb-init
- name: Check Go Version
run: echo "::set-output name=value::$(cat GO_VERSION)"
id: go-version
diff --git a/traffic_ops/testing/api_contract/v4/conftest.py
b/traffic_ops/testing/api_contract/v4/conftest.py
index a214a32804..74849b5ff1 100644
--- a/traffic_ops/testing/api_contract/v4/conftest.py
+++ b/traffic_ops/testing/api_contract/v4/conftest.py
@@ -1578,6 +1578,36 @@ def steering_data_post(to_session: TOSession,
request_template_data: list[JSONDa
pytest.fail("Response from delete request is empty, Failing
test_case")
[email protected](name="delivery_service_sslkeys_post_data")
+def delivery_service_sslkeys_data_post(to_session: TOSession,
request_template_data: list[JSONData],
+ cdn_post_data:dict[str, object],
delivery_services_post_data:dict[str, object]
+ ) -> dict[str, object]:
+ """
+ PyTest Fixture to create POST data for
delivery_service_sslkeys_post_data endpoint.
+ :param to_session: Fixture to get Traffic Ops session.
+ :param request_template_data: Fixture to get delivery_service_sslkeys
request template.
+ :returns: Sample POST data and the actual API response.
+ """
+
+ delivery_service_sslkeys = check_template_data(
+ request_template_data["delivery_service_sslkeys"],
"delivery_service_sslkeys")
+
+ # Return new post data and post response from delivery_service_sslkeys
POST request
+ delivery_service_sslkeys["key"] = delivery_services_post_data["xmlId"]
+ delivery_service_sslkeys["cdn"] = cdn_post_data["name"]
+ logger.info("New delivery_service_sslkeys data to hit POST method %s",
delivery_service_sslkeys)
+ # Hitting delivery_service_sslkeys POST methed
+ response: tuple[JSONData, requests.Response] =
to_session.generate_deliveryservice_ssl_keys(
+ data=delivery_service_sslkeys)
+ yield delivery_service_sslkeys
+ deliveryservice_xml_id = delivery_service_sslkeys["key"]
+ msg =
to_session.delete_deliveryservice_ssl_keys_by_xml_id(xml_id=deliveryservice_xml_id)
+ logger.info("Deleting delivery_service_sslkeys data... %s", msg)
+ if msg is None:
+ logger.error("delivery_service_sslkeys returned by Traffic Ops
is missing an 'xmlId' property")
+ pytest.fail("Response from delete request is empty, Failing
test_case")
+
+
@pytest.fixture(name="delivery_services_regex_post_data")
def delivery_services_regex_data_post(to_session: TOSession,
request_template_data: list[JSONData],
delivery_services_post_data:dict[str, object]) -> dict[str,
object]:
diff --git a/traffic_ops/testing/api_contract/v4/data/request_template.json
b/traffic_ops/testing/api_contract/v4/data/request_template.json
index 988c13ef4a..3ad04676bc 100644
--- a/traffic_ops/testing/api_contract/v4/data/request_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/request_template.json
@@ -376,6 +376,19 @@
}
}
],
+ "delivery_service_sslkeys": [
+ {
+ "key": "demo1",
+ "businessUnit": "CDN Engineering",
+ "version": 3,
+ "cdn": "CDN-in-a-Box",
+ "hostname": "tr.ds-01.ott.kabletown.com",
+ "country": "US",
+ "organization": "Kabletown",
+ "city": "Denver",
+ "state": "Colorado"
+ }
+ ],
"delivery_services_regex": [
{
"pattern": ".*\\.foo-bar\\..*",
diff --git a/traffic_ops/testing/api_contract/v4/data/response_template.json
b/traffic_ops/testing/api_contract/v4/data/response_template.json
index ee7939abf2..84f1fca2a6 100644
--- a/traffic_ops/testing/api_contract/v4/data/response_template.json
+++ b/traffic_ops/testing/api_contract/v4/data/response_template.json
@@ -1589,6 +1589,73 @@
}
}
},
+ "delivery_service_sslkeys": {
+ "type": "object",
+ "required": [
+ "certificate",
+ "deliveryservice",
+ "cdn",
+ "businessUnit",
+ "city",
+ "organization",
+ "hostname",
+ "country",
+ "state",
+ "version",
+ "expiration"
+ ],
+ "properties": {
+ "certificate": {
+ "type": "object",
+ "required": [
+ "crt",
+ "key",
+ "csr"
+ ],
+ "properties": {
+ "crt": {
+ "type": "string"
+ },
+ "key": {
+ "type": "string"
+ },
+ "csr": {
+ "type": "string"
+ }
+ }
+ },
+ "deliveryservice": {
+ "type": "string"
+ },
+ "cdn": {
+ "type": "string"
+ },
+ "businessUnit": {
+ "type": "string"
+ },
+ "city": {
+ "type": "string"
+ },
+ "organization": {
+ "type": "string"
+ },
+ "hostname": {
+ "type": "string"
+ },
+ "country": {
+ "type": "string"
+ },
+ "state": {
+ "type": "string"
+ },
+ "version": {
+ "type": "integer"
+ },
+ "expiration": {
+ "type": "string"
+ }
+ }
+ },
"delivery_services_regex": {
"type": "object",
"required": [
diff --git
a/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py
b/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py
new file mode 100644
index 0000000000..f0744f4f27
--- /dev/null
+++ b/traffic_ops/testing/api_contract/v4/test_delivery_services_sslkeys.py
@@ -0,0 +1,76 @@
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+#
+
+"""API Contract Test Case for delivery_service_sslkeys_generate endpoint."""
+import logging
+from typing import Union
+import pytest
+import requests
+from jsonschema import validate
+
+from trafficops.tosession import TOSession
+
+# Create and configure logger
+logger = logging.getLogger()
+
+Primitive = Union[bool, int, float, str, None]
+
+
+def test_delivery_service_sslkeys_contract(to_session: TOSession,
+ response_template_data: dict[str, Union[Primitive, list[Union[Primitive,
+ dict[str, object],
list[object]]], dict[object, object]]],
+ delivery_service_sslkeys_post_data: dict[str, object]
+) -> None:
+ """
+ Test step to validate keys, values and data types from
delivery_service_sslkeys endpoint
+ response.
+ :param to_session: Fixture to get Traffic Ops session.
+ :param response_template_data: Fixture to get response template data
from a prerequisites file.
+ :param delivery_service_sslkeys_post_data: Fixture to get delivery
services sslkeys data.
+ """
+ # validate delivery_service_sslkeys keys from api get response
+ logger.info("Accessing /delivery_service_sslkeys endpoint through
Traffic ops session.")
+
+ delivery_service_sslkeys_xml_id =
delivery_service_sslkeys_post_data["key"]
+ if not isinstance(delivery_service_sslkeys_xml_id, str):
+ raise TypeError("malformed API response; 'xmlId' property not a
string")
+
+ delivery_service_sslkeys_get_response: tuple[
+ Union[dict[str, object], list[Union[dict[str, object],
list[object], Primitive]], Primitive],
+ requests.Response
+ ] =
to_session.get_deliveryservice_ssl_keys_by_xml_id(xml_id=delivery_service_sslkeys_xml_id)
+ try:
+ first_delivery_service_sslkeys =
delivery_service_sslkeys_get_response[0]
+ if not isinstance(first_delivery_service_sslkeys, dict):
+ raise TypeError(
+ "malformed API response; first
delivery_service_sslkeys in response is not an dict")
+ logger.info("delivery_service_sslkeys Api get response %s",
first_delivery_service_sslkeys)
+
+ delivery_service_sslkeys_response_template =
response_template_data.get(
+ "delivery_service_sslkeys")
+ if not isinstance(delivery_service_sslkeys_response_template,
dict):
+ raise TypeError(f"delivery_service_sslkeys response
template data must be a dict, not '"
+
f"{type(delivery_service_sslkeys_response_template)}'")
+
+ keys = ["key", "version"]
+ prereq_values = [delivery_service_sslkeys_post_data[key] for
key in keys]
+ get_values = [first_delivery_service_sslkeys[key] for key in
keys]
+
+ assert validate(instance=first_delivery_service_sslkeys,
+ schema=delivery_service_sslkeys_response_template) is None
+ assert get_values == prereq_values
+ except IndexError:
+ logger.error("Either prerequisite data or API response was
malformed")
+ pytest.fail(
+ "API contract test failed for delivery_service_sslkeys
endpoint: API response was malformed")