Source code for argus_api.schema
import json
import time
from os.path import join, abspath, exists, dirname
import requests
from requests.exceptions import HTTPError
from jsonschema import RefResolver
from argus_api.helpers.log import log
DEFAULT_API_DEFINITION_LOCATION = join(abspath(dirname(__file__)), "..", "argus_cli", "resources", "api-definition.json")
[docs]def write_schema_to_disk(schema: dict) -> None:
"""Saves swagger data to the local filesystem with current timestamp.
It currently saves it to %cwd%/DEFAULT_API_DEFINITION_LOCATION
:param dict schema: JSON data
"""
schema["timestamp"] = int(time.time())
log.info("Saving swagger file back to filesystem...")
with open(DEFAULT_API_DEFINITION_LOCATION, 'w') as f:
json.dump(schema, f)
[docs]def find_schema(location: str) -> dict:
"""Loads JSON schema from a file or URL
:param location: Location of the swagger file
:returns: Swagger JSON in a dict
"""
schema = {"timestamp": None}
# Check if it is a file on the local filesystem
if exists(location):
return json.load(open(location))
elif exists(DEFAULT_API_DEFINITION_LOCATION):
schema = json.load(open(DEFAULT_API_DEFINITION_LOCATION))
if "timestamp" in schema and (time.time() - int(schema["timestamp"]) < 86500):
return schema
elif location[0:7] != "http://" and location[0:8] != "https://":
raise ValueError("The API schema location is not a valid address or path on the filesystem: %s" % location)
# If definition doesnt exist (because timestamp is None), or the timestamp is more than a day old,
# fetch swagger.json from the API and insert the current timestamp
if not schema["timestamp"] or (time.time() - int(schema["timestamp"]) > 86500):
response = requests.get(location)
if not response.ok:
raise HTTPError(
"Error while retrieving swagger json from %s. (Status: %s)"
% (location, response.status_code)
)
schema = response.json()
write_schema_to_disk(schema)
return schema