Skip to content

Commit 00e92d7

Browse files
committed
JSON API tests
Signed-off-by: Piotr Debski <piotr.debski@intel.com>
1 parent 93367be commit 00e92d7

File tree

2 files changed

+219
-0
lines changed

2 files changed

+219
-0
lines changed
Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
#
2+
# Copyright(c) 2019-2021 Intel Corporation
3+
# SPDX-License-Identifier: BSD-3-Clause-Clear
4+
#
5+
6+
from core.test_run import TestRun
7+
import json
8+
9+
10+
class Response_structure:
11+
response_keys = {"opencas.cache.stats.get": ["Cache id", "Cache id", "IO class", "Usage",
12+
"Requests", "Blocks", "Errors"],
13+
"opencas.cache.core.stats.get": ["Cache id", "Cache id", "IO class", "Usage",
14+
"Requests", "Blocks", "Errors"],
15+
"opencas.cache.ioclass.stats.get": ["Cache id", "Cache id", "IO class",
16+
"Usage", "Requests", "Blocks", "Errors"],
17+
"opencas.cache.core.ioclass.stats.get": ["Cache id", "Cache id", "IO class",
18+
"Usage", "Requests", "Blocks", "Errors"],
19+
"opencas.cache_list.get": [],
20+
"opencas.cache.info.get": ["Cache id", "Cache device", "Core(s) id(s)",
21+
"Cache details"],
22+
"opencas.cache.core.info.get": ["Core id", "Core path", "Core details",
23+
"State"],
24+
"opencas.cache.ioclass.info.get": ["Class id", "IO class details"]}
25+
26+
27+
class Json_api:
28+
response_structure = Response_structure()
29+
30+
@classmethod
31+
def send_request(cls, request: dict):
32+
request = json.dumps(request)
33+
TestRun.LOGGER.info(f"Request: '{request}'")
34+
exec_json_api_path = "./usr/sbin/opencas-json-api"
35+
command = f"cd / && echo '{request}' | {exec_json_api_path}"
36+
response = TestRun.executor.run(command)
37+
if response.exit_code != 0:
38+
raise Exception(f"Failed Request: '{request}'")
39+
return response.stdout
40+
41+
@classmethod
42+
def verify_response_structure(cls, command: str, response: str):
43+
response = json.loads(response)
44+
for key in cls.response_structure.response_keys[command]:
45+
if key not in response.keys():
46+
raise Exception(f"Response structure is not valid: missing {key} field")
47+
TestRun.LOGGER.info(f"Request: {command} PASSED")
48+
return True
49+
50+
@classmethod
51+
def verify_response_content(cls, response: str):
52+
raise NotImplementedError()
53+
54+
@classmethod
55+
def verify_invalid_request_response(cls, command: str, response: str):
56+
response = json.loads(response)
57+
if "error" in response.keys():
58+
TestRun.LOGGER.info(f"Invalid Request: {command} DETECTED")
59+
return
60+
raise Exception(f"Invalid Request: {command} NOT DETECTED")
61+
62+
@classmethod
63+
def check_json_api_installed(cls):
64+
command = "ls /sbin/opencas-json-api"
65+
output = TestRun.executor.run(command)
66+
if output.exit_code != 0:
67+
raise Exception("JSON API not installed - try rebuild after ./configure "
68+
"--with-json-api")
Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
#
2+
# Copyright(c) 2019-2021 Intel Corporation
3+
# SPDX-License-Identifier: BSD-3-Clause-Clear
4+
#
5+
6+
import pytest
7+
8+
from api.cas import casadm
9+
from api.cas.json_api import Json_api
10+
from core.test_run import TestRun
11+
from storage_devices.disk import DiskTypeSet, DiskType, DiskTypeLowerThan
12+
from test_utils.size import Size, Unit
13+
14+
@pytest.mark.require_disk("cache", DiskTypeSet([DiskType.optane, DiskType.nand]))
15+
@pytest.mark.require_disk("core", DiskTypeLowerThan("cache"))
16+
def test_json_api_requests():
17+
18+
with TestRun.step("Check JSON API installed"):
19+
Json_api.check_json_api_installed()
20+
21+
with TestRun.step("Prepare CAS device."):
22+
cache_disk = TestRun.disks['cache']
23+
cache_disk.create_partitions([Size(20, Unit.GibiByte)])
24+
cache_dev = cache_disk.partitions[0]
25+
26+
core_disk = TestRun.disks['core']
27+
core_disk.create_partitions([Size(20, Unit.GibiByte)])
28+
core_dev = core_disk.partitions[0]
29+
30+
cache = casadm.start_cache(cache_dev, force=True)
31+
core = cache.add_core(core_dev)
32+
TestRun.LOGGER.info(TestRun.executor.run("casadm -L").stdout)
33+
34+
with TestRun.step("Parametrize valid requests"):
35+
io_class = 0
36+
cache_id = cache.cache_id
37+
core_id = core.core_id
38+
39+
with TestRun.step("Init valid all requests"):
40+
request_opencas_cache_stats_get = {"command": "opencas.cache.stats.get",
41+
"params": {"cache id": cache_id}}
42+
request_opencas_cache_core_stats_get = {"command": "opencas.cache.core.stats.get",
43+
"params": {"cache id": cache_id,
44+
"core id": core_id}}
45+
request_opencas_cache_ioclass_stats_get = {"command":
46+
"opencas.cache.ioclass.stats.get",
47+
"params": {"cache id": cache_id,
48+
"io class": io_class}}
49+
request_opencas_cache_core_ioclass_stats_get = {"command":
50+
"opencas.cache.core.ioclass.stats.get",
51+
"params": {"cache id": cache_id,
52+
"core id": core_id,
53+
"io class": io_class}}
54+
request_opencas_cache_list_get = {"command": "opencas.cache_list.get",
55+
"params": {}}
56+
request_opencas_cache_info_get = {"command": "opencas.cache.info.get",
57+
"params": {"cache id": cache_id, }}
58+
request_opencas_core_info_get = {"command": "opencas.cache.core.info.get",
59+
"params": {"cache id": cache_id, "core id": core_id}}
60+
request_opencas_ioclass_info_get = {"command": "opencas.cache.ioclass.info.get",
61+
"params": {"cache id": cache_id, "io class": io_class}}
62+
63+
with TestRun.group("JSON API requests"):
64+
with TestRun.step("GET CACHE REQUEST"):
65+
response = Json_api.send_request(request_opencas_cache_stats_get)
66+
Json_api.verify_response_structure(request_opencas_cache_stats_get["command"], response)
67+
with TestRun.step("GET CACHE CORE REQUEST"):
68+
response = Json_api.send_request(request_opencas_cache_core_stats_get)
69+
Json_api.verify_response_structure(
70+
request_opencas_cache_core_stats_get["command"], response)
71+
with TestRun.step("GET CACHE IO CLASS REQUEST"):
72+
response = Json_api.send_request(request_opencas_cache_ioclass_stats_get)
73+
Json_api.verify_response_structure(
74+
request_opencas_cache_ioclass_stats_get["command"], response)
75+
with TestRun.step("GET CACHE CORE IO CLAS REQUEST"):
76+
response = Json_api.send_request(request_opencas_cache_core_ioclass_stats_get)
77+
Json_api.verify_response_structure(
78+
request_opencas_cache_core_ioclass_stats_get["command"], response)
79+
with TestRun.step("GET CACHE LIST"):
80+
response = Json_api.send_request(request_opencas_cache_list_get)
81+
Json_api.verify_response_structure(request_opencas_cache_list_get["command"], response)
82+
with TestRun.step("GET CACHE INFO"):
83+
response = Json_api.send_request(request_opencas_cache_info_get)
84+
Json_api.verify_response_structure(request_opencas_cache_info_get["command"], response)
85+
with TestRun.step("GET CORE INFO"):
86+
response = Json_api.send_request(request_opencas_core_info_get)
87+
Json_api.verify_response_structure(request_opencas_core_info_get["command"], response)
88+
with TestRun.step("GET IO CLASS INFO"):
89+
response = Json_api.send_request(request_opencas_ioclass_info_get)
90+
Json_api.verify_response_structure(
91+
request_opencas_ioclass_info_get["command"], response)
92+
93+
with TestRun.group("JSON API invalid requests"):
94+
with TestRun.step("Corner values"):
95+
invalid_cache_id = cache_id + 1
96+
invalid_core_id = core_id + 1
97+
different_io_class = io_class + 1
98+
99+
with TestRun.step("Init all invalid requests"):
100+
request_opencas_cache_stats_get = {"command": "opencas.cache.stats.get",
101+
"params": {"cache id": invalid_cache_id}}
102+
request_opencas_cache_core_stats_get = {"command": "opencas.cache.core.stats.get",
103+
"params": {"cache id": cache_id,
104+
"core id": invalid_core_id}}
105+
request_opencas_cache_ioclass_stats_get = {"command": "opencas.cache.ioclass.stats.get",
106+
"params": {"cache id": invalid_cache_id,
107+
"io class": different_io_class}}
108+
request_opencas_cache_core_ioclass_stats_get = {"command":
109+
"opencas.cache.core.ioclass.stats.get",
110+
"params": {"cache id": invalid_cache_id,
111+
"core id": invalid_core_id,
112+
"io class": different_io_class}}
113+
request_opencas_cache_info_get = {"command": "opencas.cache.info.get",
114+
"params": {"cache id": invalid_cache_id, }}
115+
request_opencas_core_info_get = {"command": "opencas.cache.core.info.get",
116+
"params": {"cache id": cache_id,
117+
"core id": invalid_core_id}}
118+
request_opencas_ioclass_info_get = {"command": "opencas.cache.ioclass.info.get",
119+
"params": {"cache id": invalid_cache_id,
120+
"io class": different_io_class}}
121+
122+
with TestRun.group("JSON API invalid requests"):
123+
with TestRun.step("GET CACHE REQUEST"):
124+
response = Json_api.send_request(request_opencas_cache_stats_get)
125+
Json_api.verify_invalid_request_response(request_opencas_cache_stats_get["command"],
126+
response)
127+
with TestRun.step("GET CACHE CORE REQUEST"):
128+
response = Json_api.send_request(request_opencas_cache_core_stats_get)
129+
Json_api.verify_invalid_request_response(
130+
request_opencas_cache_core_stats_get["command"], response)
131+
with TestRun.step("GET CACHE IO CLASS REQUEST"):
132+
response = Json_api.send_request(request_opencas_cache_ioclass_stats_get)
133+
Json_api.verify_invalid_request_response(
134+
request_opencas_cache_ioclass_stats_get["command"], response)
135+
with TestRun.step("GET CACHE CORE IO CLAS REQUEST"):
136+
response = Json_api.send_request(request_opencas_cache_core_ioclass_stats_get)
137+
Json_api.verify_invalid_request_response(
138+
request_opencas_cache_core_ioclass_stats_get["command"], response)
139+
140+
with TestRun.step("GET CACHE INFO"):
141+
response = Json_api.send_request(request_opencas_cache_info_get)
142+
Json_api.verify_invalid_request_response(request_opencas_cache_info_get["command"],
143+
response)
144+
with TestRun.step("GET CORE INFO"):
145+
response = Json_api.send_request(request_opencas_core_info_get)
146+
Json_api.verify_invalid_request_response(request_opencas_core_info_get["command"],
147+
response)
148+
with TestRun.step("GET IO CLASS INFO"):
149+
response = Json_api.send_request(request_opencas_ioclass_info_get)
150+
Json_api.verify_invalid_request_response(
151+
request_opencas_ioclass_info_get["command"], response)

0 commit comments

Comments
 (0)