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

Verified

This commit was created on GitHub.com and signed with GitHub’s verified signature. The key has expired.
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.