Add get_all_appointments cli command

This commit is contained in:
Turtle
2020-03-28 18:48:45 -04:00
parent 8991f71148
commit b6b95a9821
4 changed files with 105 additions and 6 deletions

View File

@@ -104,7 +104,17 @@ if `-f, --file` **is** specified, then the command expects a path to a json file
python teos_cli.py get_appointment <appointment_locator> python teos_cli.py get_appointment <appointment_locator>
### get_all_appointments
This command is used to get information about all the appointments stored in a Eye of Satoshi tower.
**Responses**
This command returns all appointments stored in the watchtower. More precisely, it returns all the "response_trackers" and "watchtower_appointments" in a dictionary.
#### Usage
python teos_cli.py get_all_appointments
### help ### help

View File

@@ -6,6 +6,7 @@ def show_usage():
"\n\tregister \tRegisters your user public key with the tower." "\n\tregister \tRegisters your user public key with the tower."
"\n\tadd_appointment \tRegisters a json formatted appointment with the tower." "\n\tadd_appointment \tRegisters a json formatted appointment with the tower."
"\n\tget_appointment \tGets json formatted data about an appointment from the tower." "\n\tget_appointment \tGets json formatted data about an appointment from the tower."
"\n\tget_all_appointments \tGets information about all appointments stored in the tower."
"\n\thelp \t\t\tShows a list of commands or help for a specific command." "\n\thelp \t\t\tShows a list of commands or help for a specific command."
"\n\nGLOBAL OPTIONS:" "\n\nGLOBAL OPTIONS:"
"\n\t-s, --server \tAPI server where to send the requests. Defaults to 'localhost' (modifiable in conf file)." "\n\t-s, --server \tAPI server where to send the requests. Defaults to 'localhost' (modifiable in conf file)."
@@ -51,3 +52,14 @@ def help_get_appointment():
"\n\nDESCRIPTION:" "\n\nDESCRIPTION:"
"\n\n\tGets json formatted data about an appointment from the tower.\n" "\n\n\tGets json formatted data about an appointment from the tower.\n"
) )
def help_get_all_appointments():
return (
"NAME:"
"\tpython teos_cli get_all_appointments - Gets information about all appointments stored in the tower."
"\n\nUSAGE:"
"\tpython teos_cli get_all_appointments"
"\n\nDESCRIPTION:"
"\n\n\tGets information about all appointments stored in the tower.\n"
)

View File

@@ -10,7 +10,7 @@ from getopt import getopt, GetoptError
from requests import ConnectTimeout, ConnectionError from requests import ConnectTimeout, ConnectionError
from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL from requests.exceptions import MissingSchema, InvalidSchema, InvalidURL
from cli.help import show_usage, help_add_appointment, help_get_appointment, help_register from cli.help import show_usage, help_add_appointment, help_get_appointment, help_register, help_get_all_appointments
from cli import DEFAULT_CONF, DATA_DIR, CONF_FILE_NAME, LOG_PREFIX from cli import DEFAULT_CONF, DATA_DIR, CONF_FILE_NAME, LOG_PREFIX
import common.cryptographer import common.cryptographer
@@ -175,6 +175,39 @@ def get_appointment(locator, cli_sk, teos_pk, teos_url):
return response_json return response_json
def get_all_appointments(teos_url):
"""
Gets information about all appointments stored in the tower, if the user requesting the data is an administrator.
Args:
get_all_appointments_endpoint (:obj:`str`): the teos endpoint from which all appointments can be retrieved.
Returns:
:obj:`dict` a dictionary containing all the appointments stored by the Responder and Watcher if the tower
responds.
"""
get_all_appointments_endpoint = "{}/get_all_appointments".format(teos_url)
try:
response = requests.get(url=get_all_appointments_endpoint, timeout=5)
if response.status_code != constants.HTTP_OK:
logger.error("The server returned a 'not found' error")
return None
response_json = json.dumps(response.json(), indent=4, sort_keys=True)
return response_json
except ConnectionError:
logger.error("Can't connect to the Eye of Satoshi's API. Server cannot be reached")
return None
except requests.exceptions.Timeout:
logger.error("The request timed out")
return None
def load_keys(teos_pk_path, cli_sk_path, cli_pk_path): def load_keys(teos_pk_path, cli_sk_path, cli_pk_path):
""" """
Loads all the keys required so sign, send, and verify the appointment. Loads all the keys required so sign, send, and verify the appointment.
@@ -426,6 +459,11 @@ def main(args, command_line_conf):
if appointment_data: if appointment_data:
print(appointment_data) print(appointment_data)
elif command == "get_all_appointments":
appointment_data = get_all_appointments(teos_url)
if appointment_data:
print(appointment_data)
elif command == "help": elif command == "help":
if args: if args:
command = args.pop(0) command = args.pop(0)
@@ -442,6 +480,9 @@ def main(args, command_line_conf):
else: else:
logger.error("Unknown command. Use help to check the list of available commands") logger.error("Unknown command. Use help to check the list of available commands")
elif command == "get_all_appointments":
sys.exit(help_get_all_appointments())
else: else:
sys.exit(show_usage()) sys.exit(show_usage())
@@ -457,7 +498,7 @@ def main(args, command_line_conf):
if __name__ == "__main__": if __name__ == "__main__":
command_line_conf = {} command_line_conf = {}
commands = ["register", "add_appointment", "get_appointment", "help"] commands = ["register", "add_appointment", "get_appointment", "get_all_appointments", "help"]
try: try:
opts, args = getopt(argv[1:], "s:p:h", ["server", "port", "help"]) opts, args = getopt(argv[1:], "s:p:h", ["server", "port", "help"])

View File

@@ -4,7 +4,8 @@ import shutil
import responses import responses
from binascii import hexlify from binascii import hexlify
from coincurve import PrivateKey from coincurve import PrivateKey
from requests.exceptions import ConnectionError from requests.exceptions import ConnectionError, Timeout
from http.client import HTTPException
import common.cryptographer import common.cryptographer
from common.logger import Logger from common.logger import Logger
@@ -31,6 +32,7 @@ teos_url = "http://{}:{}".format(config.get("TEOS_SERVER"), config.get("TEOS_POR
add_appointment_endpoint = "{}/add_appointment".format(teos_url) add_appointment_endpoint = "{}/add_appointment".format(teos_url)
register_endpoint = "{}/register".format(teos_url) register_endpoint = "{}/register".format(teos_url)
get_appointment_endpoint = "{}/get_appointment".format(teos_url) get_appointment_endpoint = "{}/get_appointment".format(teos_url)
get_all_appointments_endpoint = "{}/get_all_appointments".format(teos_url)
dummy_appointment_data = { dummy_appointment_data = {
"tx": get_random_value_hex(192), "tx": get_random_value_hex(192),
@@ -194,7 +196,7 @@ def test_post_request():
@responses.activate @responses.activate
def test_process_post_response(): def test_process_post_response():
# Let's first crete a response # Let's first create a response
response = { response = {
"locator": dummy_appointment.to_dict()["locator"], "locator": dummy_appointment.to_dict()["locator"],
"signature": get_signature(dummy_appointment.serialize(), dummy_teos_sk), "signature": get_signature(dummy_appointment.serialize(), dummy_teos_sk),
@@ -257,3 +259,37 @@ def test_save_appointment_receipt(monkeypatch):
assert any([dummy_appointment.locator in f for f in files]) assert any([dummy_appointment.locator in f for f in files])
shutil.rmtree(appointments_folder) shutil.rmtree(appointments_folder)
@responses.activate
def test_get_all_appointments():
# Response of get_all_appointments endpoint is all appointments from watcher and responder.
dummy_appointment_dict["status"] = "being_watched"
response = {"watcher_appointments": dummy_appointment_dict, "responder_trackers": {}}
request_url = get_all_appointments_endpoint
responses.add(responses.GET, request_url, json=response, status=200)
result = teos_cli.get_all_appointments(teos_url)
assert len(responses.calls) == 1
assert responses.calls[0].request.url == request_url
assert json.loads(result).get("locator") == response.get("locator")
@responses.activate
def test_get_all_appointments_err():
# Test that get_all_appointments handles a connection error appropriately.
request_url = get_all_appointments_endpoint
responses.add(responses.GET, request_url, body=ConnectionError())
assert not teos_cli.get_all_appointments(teos_url)
# Test that get_all_appointments handles a timeout error appropriately.
responses.replace(responses.GET, request_url, body=Timeout())
assert not teos_cli.get_all_appointments(teos_url)
# Test that get_all_appointments handles a 404 error appropriately.
responses.replace(responses.GET, request_url, status=404)
assert teos_cli.get_all_appointments(teos_url) is None