Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
63 changes: 18 additions & 45 deletions health_check.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,16 @@
import smtplib
import socket
import time
import asyncio
from argparse import Namespace
from email.message import EmailMessage
from pathlib import Path

import requests
from slack_sdk import WebClient
from slack_sdk.webhook import WebhookClient
from webscreenshot.webscreenshot import take_screenshot

import playwright_workflow


def health_check(server=None, timeout=10.0):
Expand Down Expand Up @@ -41,7 +44,7 @@ def health_check(server=None, timeout=10.0):
except requests.exceptions.ConnectionError:
return False

if r.status_code != 200:
if r.status_code not in [200, 302]:
print(
f"The return code is {r.status_code}. "
f"Something is wrong with {server}."
Expand Down Expand Up @@ -125,44 +128,12 @@ def post_slack_message(subject, content, test=False):

def get_screenshots(url_list, output_dir):

shutil.rmtree(output_dir, ignore_errors=True)

options = Namespace(
URL=None,
ajax_max_timeouts="5000,10000",
cookie=None,
crop=None,
custom_js=None,
format="png",
header=None,
http_password=None,
http_username=None,
imagemagick_binary=None,
input_file=None,
label=False,
label_bg_color="NavajoWhite",
label_size=60,
log_level="DEBUG",
multiprotocol=False,
no_error_file=False,
no_xserver=True,
output_directory=output_dir,
port=None,
proxy=None,
proxy_auth=None,
proxy_type=None,
quality=75,
renderer="phantomjs",
renderer_binary=None,
single_output_file=None,
ssl=False,
timeout="60",
verbosity=2,
window_size="1200,800",
workers=4,
)

take_screenshot(url_list=url_list, options=options)
timestamp = datetime.datetime.now().strftime('%Y-%m-%dT%H.%M.%S')
path = Path(output_dir) / timestamp
path.mkdir(parents=True)
coro = playwright_workflow.generate_screenshots(path)
asyncio.run(coro)
return path


def upload_files_to_slack(files):
Expand Down Expand Up @@ -204,8 +175,10 @@ def _to_json(statuses):

def main(test=True):
servers = [
"https://expdev-test.nsls2.bnl.gov/srw#/simulations",
"https://expdev.nsls2.bnl.gov/srw#/simulations",
# "https://raydata.nsls2.bnl.gov/raydata/",
"http://127.0.0.1:8081/raydata",
# "https://expdev-test.nsls2.bnl.gov/srw#/simulations",
# "https://expdev.nsls2.bnl.gov/srw#/simulations",
# 'https://expdev.nsls2.bnl.gov/light',
# 'http://nsls2expdev1.bnl.gov:8000/light',
# 'http://localhost:8000/light',
Expand Down Expand Up @@ -354,11 +327,11 @@ def main(test=True):
# send_status_email(subject, addressees, '\n'.join(msgs), test=test)
post_slack_message(subject, "\n".join(msgs), test=test)

output_dir = "/tmp/sirepo-healthcheck-screenshots"
output_dir = "/tmp/hw-sirepo-healthcheck-screenshots"

get_screenshots(url_list=servers, output_dir=output_dir)
output_subdir = get_screenshots(url_list=servers, output_dir=output_dir)

files = glob.glob(os.path.join(output_dir, "*.png"))
files = glob.glob(os.path.join(output_subdir, "*.png"))
upload_files_to_slack(files)


Expand Down
59 changes: 59 additions & 0 deletions playwright-test.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"""
Check https://playwright.dev/python/docs/intro for more info.

$ pip install playwright
$ playwright install
$ python playwright-test.py

"""
import asyncio
import datetime
import os
import re
from itertools import count
from playwright.async_api import async_playwright, expect

BASE_URL = "http://127.0.0.1:8081/raydata"


def log_msg(msg):
print(f"{datetime.datetime.now().isoformat()} {msg}")


async def main():
async with async_playwright() as p:
counter = count()
log_msg("Launch a browser")
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
page.set_default_timeout(timeout=60_000) # in milliseconds

log_msg(f"Go to {BASE_URL}")
await page.goto(BASE_URL)

await expect(page).to_have_title(re.compile("Raydata"))

await expect(page.get_by_role("link", name="Examples", exact=True)).to_be_visible()

log_msg("Taking a screenshot")
await page.screenshot(path=f"screenshot-{next(counter):02d}.png", full_page=True)

await page.get_by_role("link", name="Examples", exact=True).click()

log_msg("Taking a screenshot")
await page.screenshot(path=f"screenshot-{next(counter):02d}.png", full_page=True)

await expect(page.get_by_role("link", name="CHX Analysis", exact=True)).to_be_visible()
await page.get_by_role("link", name="CHX Analysis", exact=True).click()

log_msg("Taking a screenshot")
await page.screenshot(path=f"screenshot-{next(counter):02d}.png", full_page=True)

log_msg("Close the browser")
await browser.close()


if __name__ == "__main__":

asyncio.run(main())

64 changes: 64 additions & 0 deletions playwright_workflow.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,64 @@
"""
Check https://playwright.dev/python/docs/intro for more info.

$ pip install playwright
$ playwright install
$ python playwright-test.py

"""
import asyncio
import datetime
import os
import re
from playwright.async_api import async_playwright, expect
from pathlib import Path

BASE_URL = "http://127.0.0.1:8081/raydata"


def log_msg(msg):
print(f"{datetime.datetime.now().isoformat()} {msg}")


async def generate_screenshots(output_dir):
async with async_playwright() as p:
log_msg("Launch a browser")
browser = await p.chromium.launch(headless=True)
page = await browser.new_page()
page.set_default_timeout(timeout=60_000) # in milliseconds
timestamp = lambda: datetime.datetime.now().strftime("%Y%m%d-%H%M%S")
unique_filepath = lambda name="image": (f"{output_dir}/screenshot-{timestamp()}-{name}.png")

log_msg(f"Go to {BASE_URL}")
await page.goto(BASE_URL)

await expect(page).to_have_title(re.compile("Raydata"))

await expect(page.get_by_role("link", name="Examples", exact=True)).to_be_visible()

log_msg("Taking a screenshot")
await page.screenshot(path=unique_filepath("home_page"), full_page=True)

await page.get_by_role("link", name="Examples", exact=True).click()

log_msg("Taking a screenshot")
await page.screenshot(path=unique_filepath("examples_page"), full_page=True)

await expect(page.get_by_role("link", name="CHX Analysis", exact=True)).to_be_visible()
await page.get_by_role("link", name="CHX Analysis", exact=True).click()

log_msg("Taking a screenshot")
await page.screenshot(path=unique_filepath("CHX_analysis_page"), full_page=True)

log_msg("Close the browser")
await browser.close()


if __name__ == "__main__":

import argparse
parser = argparse.ArgumentParser()
parser.add_argument("-o", "--output-dir", type=Path, default=".", help="Path to save screenshots", dest="OUTPUT_DIR")
args = parser.parse_args()
asyncio.run(generate_screenshots(args.OUTPUT_DIR))