Skip to content

Commit

Permalink
refactor: Variable rename and move (to config)
Browse files Browse the repository at this point in the history
Alan Christie committed Jan 24, 2025
1 parent 1316514 commit e0801a8
Showing 6 changed files with 59 additions and 56 deletions.
30 changes: 18 additions & 12 deletions behaviour/features/steps/api_utils.py
Original file line number Diff line number Diff line change
@@ -13,11 +13,17 @@
from requests_toolbelt import MultipartEncoder

# Trailing slashes are important!
LANDING_PAGE_ENDPOINT: str = "/viewer/react/landing/"
UPLOAD_ENDPOINT = "/api/upload_target_experiments/"
_LANDING_PAGE_ENDPOINT: str = "/viewer/react/landing/"

_JOB_CONFIG_ENDPOINT: str = "/api/job_config/"
_JOB_FILE_TRANSFER_ENDPOINT: str = "/api/job_file_transfer/"
_JOB_REQUEST_ENDPOINT: str = "/api/job_request/"
_SESSION_PROJECTS_ENDPOINT: str = "/api/session-projects/"
_SNAPSHOTS_ENDPOINT: str = "/api/snapshots/"
_UPLOAD_TARGET_EXPERIMENTS_ENDPOINT: str = "/api/upload_target_experiments/"

# this needs to be kept more or less up to date
USER_AGENT: str = (
_USER_AGENT: str = (
"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
)

@@ -78,7 +84,7 @@ def create_session_project(
print(f"Creating SessionProject with data: {data}...")
with requests.Session() as session:
_prepare_session(session, base_url=base_url, session_id=session_id)
return session.post(urljoin(base_url, "/api/session-projects/"), json=data)
return session.post(urljoin(base_url, _SESSION_PROJECTS_ENDPOINT), json=data)


def create_snapshot(
@@ -96,7 +102,7 @@ def create_snapshot(
print(f"Creating Snapshot with data: {data}...")
with requests.Session() as session:
_prepare_session(session, base_url=base_url, session_id=session_id)
return session.post(urljoin(base_url, "/api/snapshots/"), json=data)
return session.post(urljoin(base_url, _SNAPSHOTS_ENDPOINT), json=data)


def upload_target_experiment(
@@ -127,7 +133,7 @@ def upload_target_experiment(

content_type = encoder.content_type
session.headers.update({"Content-Type": content_type})
url = urljoin(base_url, UPLOAD_ENDPOINT)
url = urljoin(base_url, _UPLOAD_TARGET_EXPERIMENTS_ENDPOINT)
return session.post(url, data=encoder, stream=True)


@@ -154,7 +160,7 @@ def initiate_job_file_transfer(
print(f"Initiating Squonk file transfer with data: {data}...")
with requests.Session() as session:
_prepare_session(session, base_url=base_url, session_id=session_id)
return session.post(urljoin(base_url, "/api/job_file_transfer/"), json=data)
return session.post(urljoin(base_url, _JOB_FILE_TRANSFER_ENDPOINT), json=data)


def initiate_job_request(
@@ -187,7 +193,7 @@ def initiate_job_request(
print(f"Initiating Squonk file transfer with data: {data}...")
with requests.Session() as session:
_prepare_session(session, base_url=base_url, session_id=session_id)
return session.post(urljoin(base_url, "/api/job_request/"), json=data)
return session.post(urljoin(base_url, _JOB_REQUEST_ENDPOINT), json=data)


def get_job_config(
@@ -208,7 +214,7 @@ def get_job_config(
print(f"Getting JobConfig with params: {params}...")
with requests.Session() as session:
_prepare_session(session, base_url=base_url, session_id=session_id)
return session.get(urljoin(base_url, "/api/job_config/"), params=params)
return session.get(urljoin(base_url, _JOB_CONFIG_ENDPOINT), params=params)


# Local functions
@@ -218,13 +224,13 @@ def _prepare_session(session, *, base_url: str, session_id: str) -> None:
"""Prepares a session for use with the stack."""
session.headers.update(
{
"User-Agent": USER_AGENT,
"Referer": urljoin(base_url, LANDING_PAGE_ENDPOINT),
"User-Agent": _USER_AGENT,
"Referer": urljoin(base_url, _LANDING_PAGE_ENDPOINT),
"Referrer-policy": "same-origin",
}
)
session.get(base_url) # A GET sets any csrftoken
if csrftoken := session.cookies.get("csrftoken", None):
session.headers.update({"X-CSRFToken": csrftoken, "User-Agent": USER_AGENT})
session.headers.update({"X-CSRFToken": csrftoken, "User-Agent": _USER_AGENT})
if session_id:
session.cookies.update({"sessionid": session_id})
15 changes: 0 additions & 15 deletions behaviour/features/steps/awx_utils.py
Original file line number Diff line number Diff line change
@@ -12,21 +12,6 @@
from config import AWX_HOST, AWX_PASSWORD, AWX_USERNAME, get_env_name


def get_stack_url(name: str) -> str:
"""Returns the stack URL (i.e. https://example.com) that is expected to have been
created by the AWX Job Template for the AWX user."""
if not AWX_USERNAME:
raise ValueError(get_env_name("AWX_USERNAME") + " is not set")
return f"https://fragalysis-{AWX_USERNAME.lower()}-{name.lower()}.xchem-dev.diamond.ac.uk"


def get_stack_username() -> str:
"""Returns the AWX username - tha author of the stack."""
if not AWX_USERNAME:
raise ValueError(get_env_name("AWX_USERNAME") + " is not set")
return AWX_USERNAME


def launch_awx_job_template(template, *, extra_vars) -> None:
"""A utility to launch the named AWX JobTemplate
while also providing extra variables via a temporary file.
24 changes: 2 additions & 22 deletions behaviour/features/steps/browser_utils.py
Original file line number Diff line number Diff line change
@@ -5,11 +5,8 @@
import re
from html import unescape

from awx_utils import get_stack_url
from config import (
DJANGO_SUPERUSER_PASSWORD,
STACK_CLIENT_ID_SECRET,
STACK_NAME,
STACK_PASSWORD,
STACK_USERNAME,
get_env_name,
@@ -21,27 +18,15 @@
_RE_SESSION_ID = re.compile(r"\"sessionid\": \"([a-z0-9]+)\"")


def get_stack_client_id_secret() -> str:
"""Returns the configured Client ID secret"""
if not STACK_CLIENT_ID_SECRET:
raise ValueError(get_env_name("STACK_CLIENT_ID_SECRET") + " is not set")
return STACK_CLIENT_ID_SECRET


def get_stack_name() -> str:
"""Returns the configured stack name (lower case)"""
if not STACK_NAME:
raise ValueError(get_env_name("STACK_NAME") + " is not set")
return STACK_NAME.lower()


def login(host_url: str, login_type: str = "cas") -> str:
"""Login to a Fragalysis Stack (with assumed CAS authentication)
given a host url(i.e. https://example.com)."""
if not STACK_USERNAME:
raise ValueError(get_env_name("STACK_USERNAME") + " is not set")
if not STACK_PASSWORD:
raise ValueError(get_env_name("STACK_PASSWORD") + " is not set")
if not DJANGO_SUPERUSER_PASSWORD:
raise ValueError(get_env_name("DJANGO_SUPERUSER_PASSWORD") + " is not set")

assert login_type in {"cas", "superuser"}

@@ -128,8 +113,3 @@ def _run_login_logic_for_superuser(
browser.close()

return session_id_value


if __name__ == "__main__":
session_id = login(get_stack_url("behaviour"))
print(session_id)
33 changes: 33 additions & 0 deletions behaviour/features/steps/config.py
Original file line number Diff line number Diff line change
@@ -58,3 +58,36 @@ def _get(name: str, default_value: Optional[str] = None) -> Optional[str]:
AWX_STACK_WIPE_JOB_TEMPLATE: str = (
"User (%(username)s) Developer Fragalysis Stack [WIPE]"
)


# Convenience functions for config values
# (that raise exceptions if the config is not set)


def get_stack_client_id_secret() -> str:
"""Returns the configured Client ID secret"""
if not STACK_CLIENT_ID_SECRET:
raise ValueError(get_env_name("STACK_CLIENT_ID_SECRET") + " is not set")
return STACK_CLIENT_ID_SECRET


def get_stack_name() -> str:
"""Returns the configured stack name (lower case)"""
if not STACK_NAME:
raise ValueError(get_env_name("STACK_NAME") + " is not set")
return STACK_NAME.lower()


def get_stack_username() -> str:
"""Returns the AWX username - tha author of the stack."""
if not AWX_USERNAME:
raise ValueError(get_env_name("AWX_USERNAME") + " is not set")
return AWX_USERNAME


def get_stack_url(name: str) -> str:
"""Returns the stack URL (i.e. https://example.com) that is expected to have been
created by the AWX Job Template for the AWX user."""
if not AWX_USERNAME:
raise ValueError(get_env_name("AWX_USERNAME") + " is not set")
return f"https://fragalysis-{AWX_USERNAME.lower()}-{name.lower()}.xchem-dev.diamond.ac.uk"
5 changes: 0 additions & 5 deletions behaviour/features/steps/s3_utils.py
Original file line number Diff line number Diff line change
@@ -61,8 +61,3 @@ def _check_env() -> None:
raise ValueError(get_env_name("S3_SECRET_ACCESS_KEY") + " is not set")
if S3_ACCESS_KEY_ID is None or S3_ACCESS_KEY_ID == "":
raise ValueError(get_env_name("S3_ACCESS_KEY_ID") + " is not set")


if __name__ == "__main__":
check_bucket("im-xchem-data")
get_object("im-xchem-data", "lb32627-66_v2.2_upload_1_2024-12_09.tgz")
8 changes: 6 additions & 2 deletions behaviour/features/steps/steps.py
Original file line number Diff line number Diff line change
@@ -39,15 +39,19 @@
initiate_job_request,
upload_target_experiment,
)
from awx_utils import get_stack_url, get_stack_username, launch_awx_job_template
from awx_utils import launch_awx_job_template
from behave import given, then, when
from browser_utils import get_stack_client_id_secret, get_stack_name, login
from browser_utils import login
from config import (
AWX_STACK_CREATE_JOB_TEMPLATE,
AWX_STACK_WIPE_JOB_TEMPLATE,
DJANGO_SUPERUSER_PASSWORD,
REQUEST_POLL_PERIOD_S,
REQUEST_TIMEOUT,
get_stack_client_id_secret,
get_stack_name,
get_stack_url,
get_stack_username,
)
from s3_utils import check_bucket, get_object

0 comments on commit e0801a8

Please sign in to comment.