diff --git a/Dockerfile b/Dockerfile index 4546c5bc1711a2fa2df489886bf23750afc47930..839918f770034c152dae9d32dd22c7304f02abff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -57,7 +57,6 @@ COPY docker/entrypoint /usr/local/bin/entrypoint COPY docker/cleanup /usr/local/bin/cleanup COPY docker/supervisord.conf /etc/supervisor/supervisord.conf COPY docker/supervisord-apache2.conf /etc/supervisor/conf.d/apache2.conf -COPY docker/supervisord-lvalert-overseer.conf /etc/supervisor/conf.d/overseer.conf COPY docker/supervisord-igwn-alert-overseer.conf /etc/supervisor/conf.d/igwn-overseer.conf COPY docker/supervisord-shibd.conf /etc/supervisor/conf.d/shibd.conf COPY docker/shibboleth-ds /etc/shibboleth-ds diff --git a/config/settings/base.py b/config/settings/base.py index 02e3600348678a97b9135975eeacf81110dccd0f..ed8307b4daa1e75dfa0d58e4aa36208f8b1cc583 100644 --- a/config/settings/base.py +++ b/config/settings/base.py @@ -124,6 +124,12 @@ LOGOUT_REDIRECT_URL = 'home' SEND_XMPP_ALERTS = False SEND_PHONE_ALERTS = False SEND_EMAIL_ALERTS = False + +# igwn-alert group settings. the default development group is 'lvalert-dev' +# for the container deployments, the variable will be overwriten by the +# IGWN_ALERT_GROUP environment variable. +DEFAULT_IGWN_ALERT_GROUP = 'lvalert-dev' + # Use LVAlert Overseer? USE_LVALERT_OVERSEER = True # For each LVAlert server, a separate instance of LVAlert Overseer @@ -131,13 +137,10 @@ USE_LVALERT_OVERSEER = True # lvalert_server: LVAlert server which overseer sends messages to # listen_port: port which that instance of overseer is listening on LVALERT_OVERSEER_INSTANCES = [ - { - "lvalert_server": "lvalert-test.cgca.uwm.edu", - "listen_port": 8001, - }, { "lvalert_server": "kafka://kafka.scimma.org/", "listen_port": 8002, + "igwn_alert_group": DEFAULT_IGWN_ALERT_GROUP, }, ] diff --git a/config/settings/container/base.py b/config/settings/container/base.py index e86da12dd881bfcebaaa677a60a46c048d597395..62ac6467178d94cdab09806b00f80e4e58da68ef 100644 --- a/config/settings/container/base.py +++ b/config/settings/container/base.py @@ -73,27 +73,6 @@ if (isinstance(igwn_alert_on, str) and else: igwn_alert_overseer_on = False -# Get LVAlert server -lvalert_server = os.environ.get('LVALERT_SERVER', None) -if lvalert_server is None: - raise ImproperlyConfigured('Could not get LVAlert server from envvars.') - -# Get LVAlert Overseer listen port -lvalert_overseer_port = os.environ.get('LVALERT_OVERSEER_PORT', None) -if lvalert_overseer_port is None: - raise ImproperlyConfigured('Could not get LVAlert overseer port ' - 'from envvars.') - -# Get LVAlert username -lvalert_user = os.environ.get('LVALERT_USER', None) -if lvalert_user is None: - raise ImproperlyConfigured('Could not get LVAlert username from envvars.') - -# Get LVAlert password -lvalert_password = os.environ.get('LVALERT_PASSWORD', None) -if lvalert_password is None: - raise ImproperlyConfigured('Could not get LVAlert password from envvars.') - # Get igwn-alert server igwn_alert_server = os.environ.get('IGWN_ALERT_SERVER', None) if lvalert_server is None: @@ -101,18 +80,21 @@ if lvalert_server is None: # Get igwn-alert Overseer listen port igwn_alert_overseer_port = os.environ.get('IGWN_ALERT_OVERSEER_PORT', None) -if lvalert_overseer_port is None: +if igwn_alert_overseer_port is None: raise ImproperlyConfigured('Could not get igwn-alert overseer port ' 'from envvars.') +# Get igwn-alert group from envirnment: +igwn_alert_group = os.environ.get('IGWN_ALERT_GROUP', DEFAULT_IGWN_ALERT_GROUP) + # Get igwn-alert username igwn_alert_user = os.environ.get('IGWN_ALERT_USER', None) -if lvalert_user is None: +if igwn_alert_user is None: raise ImproperlyConfigured('Could not get igwn-alert username from envvars.') # Get igwn-alert password igwn_alert_password = os.environ.get('IGWN_ALERT_PASSWORD', None) -if lvalert_password is None: +if igwn_alert_password is None: raise ImproperlyConfigured('Could not get igwn-alert password from envvars.') # Get Twilio account information from environment @@ -328,21 +310,14 @@ except: # Main server "hostname" - a little hacky but OK SERVER_HOSTNAME = SERVER_FQDN.split('.')[0] -# LVAlert Overseer settings - get from environment +# igwn_alert Overseer settings - get from environment LVALERT_OVERSEER_INSTANCES = [] -LVALERT_OVERSEER_INSTANCES = [ - { - "lvalert_server": lvalert_server, - "listen_port": int(lvalert_overseer_port), - "username": lvalert_user, - "password": lvalert_password, - }] - if igwn_alert_overseer_on: LVALERT_OVERSEER_INSTANCES.append( { "lvalert_server": igwn_alert_server, "listen_port": int(igwn_alert_overseer_port), + "igwn_alert_group": igwn_alert_group, "username": igwn_alert_user, "password": igwn_alert_password, } @@ -351,7 +326,7 @@ if igwn_alert_overseer_on: INSTANCE_STUB = """ <li>Phone alerts (calls/SMS) are {0}</li> <li>Email alerts are {1}</li> -<li><span class="text-monospace">LVAlert</span> messages to <span class="text-monospace">{2}</span> are {3}</li> +<li><span class="text-monospace">igwn-alert</span> messages to <span class="text-monospace">{2}</span> are {3}</li> """ INSTANCE_LIST = INSTANCE_STUB.format(ENABLED[SEND_PHONE_ALERTS], @@ -359,12 +334,6 @@ INSTANCE_LIST = INSTANCE_STUB.format(ENABLED[SEND_PHONE_ALERTS], LVALERT_OVERSEER_INSTANCES[0]['lvalert_server'], ENABLED[SEND_XMPP_ALERTS]) -if (len(LVALERT_OVERSEER_INSTANCES) == 2): - IGWN_STUB = '<li><span class="text-monospace">igwn-alert</span> messages to <span class="text-monospace">{0}</span> are {1}</li>' - IGWN_LIST = IGWN_STUB.format(LVALERT_OVERSEER_INSTANCES[1]['lvalert_server'], - ENABLED[SEND_XMPP_ALERTS]) - INSTANCE_LIST = INSTANCE_LIST + IGWN_LIST - # Use full client certificate to authenticate REST_FRAMEWORK['DEFAULT_AUTHENTICATION_CLASSES'] = ( 'api.backends.GraceDbAuthenticatedAuthentication', diff --git a/config/settings/container/dev.py b/config/settings/container/dev.py index 8da822978936dc2af6556e126fbe1a02a12414cb..37889a8765d5d6e1b1200be86fdaec9810751838 100644 --- a/config/settings/container/dev.py +++ b/config/settings/container/dev.py @@ -72,12 +72,10 @@ if sentry_dsn is not None: INSTANCE_TITLE = 'GraceDB Development VM' # Add sub-bullet with igwn-alert group: -if (len(LVALERT_OVERSEER_INSTANCES) == 2): - igwn_alert_group = os.environ.get('IGWN_ALERT_GROUP', 'lvalert-dev') - group_sub_bullet = """<ul> - <li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> - </ul>""".format(igwn_alert_group) - INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet +group_sub_bullet = """<ul> +<li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> +</ul>""".format(LVALERT_OVERSEER_INSTANCES[0]['igwn_alert_group']) +INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet INSTANCE_TITLE = 'GraceDB Development Server' INSTANCE_INFO = """ diff --git a/config/settings/container/playground.py b/config/settings/container/playground.py index 3ab722b05ece8bd0959b2946eba5e9cc19e9fed9..ee88ed96c050bff0116fb24027028689ac54697e 100644 --- a/config/settings/container/playground.py +++ b/config/settings/container/playground.py @@ -23,12 +23,10 @@ ALLOWED_HOSTS += ['testserver'] INSTANCE_TITLE = 'GraceDB Playground' # Add sub-bullet with igwn-alert group: -if (len(LVALERT_OVERSEER_INSTANCES) == 2): - igwn_alert_group = os.environ.get('IGWN_ALERT_GROUP', 'lvalert-dev') - group_sub_bullet = """<ul> - <li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> - </ul>""".format(igwn_alert_group) - INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet +group_sub_bullet = """<ul> +<li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> +</ul>""".format(LVALERT_OVERSEER_INSTANCES[0]['igwn_alert_group']) +INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet INSTANCE_INFO = """ <h5>Playground instance</h5> diff --git a/config/settings/container/production.py b/config/settings/container/production.py index bb52156d19670589290d9ca14d1fe8d2c96fd3f3..34321e81a82d9862ff482714d0d5f61fed953e31 100644 --- a/config/settings/container/production.py +++ b/config/settings/container/production.py @@ -57,7 +57,13 @@ if sentry_dsn is not None: LOGGING['loggers']['django.request']['handlers'] = [] # Home page stuff -INSTANCE_TITLE = 'GraceDB Playground' +INSTANCE_TITLE = 'GraceDB' + +# Add sub-bullet with igwn-alert group: +group_sub_bullet = """<ul> +<li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> +</ul>""".format(LVALERT_OVERSEER_INSTANCES[0]['igwn_alert_group']) +INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet INSTANCE_INFO = """ <h5>GraceDB Notifications</h5> diff --git a/config/settings/container/test.py b/config/settings/container/test.py index dda5ea839e3784c291c0c056e3c422a128ed0d6e..eefba50c4c9a2b51b7ce50bd728a4626db324214 100644 --- a/config/settings/container/test.py +++ b/config/settings/container/test.py @@ -72,12 +72,10 @@ if sentry_dsn is not None: INSTANCE_TITLE = 'GraceDB Testing Server' # Add sub-bullet with igwn-alert group: -if (len(LVALERT_OVERSEER_INSTANCES) == 2): - igwn_alert_group = os.environ.get('IGWN_ALERT_GROUP', 'lvalert-dev') - group_sub_bullet = """<ul> - <li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> - </ul>""".format(igwn_alert_group) - INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet +group_sub_bullet = """<ul> +<li> Messages are sent to group: <span class="text-monospace"> {0} </span></li> +</ul>""".format(LVALERT_OVERSEER_INSTANCES[0]['igwn_alert_group']) +INSTANCE_LIST = INSTANCE_LIST + group_sub_bullet INSTANCE_INFO = """ <h5>Testing Instance</h5> diff --git a/config/settings/vm/base.py b/config/settings/vm/base.py index aaa5d77fedec3c4a50f382834cbc469b43bcf49d..9201d99006932ca267121145eb08c756658182d4 100644 --- a/config/settings/vm/base.py +++ b/config/settings/vm/base.py @@ -95,17 +95,10 @@ BETA_REPORTS_LINK = True INSTANCE_STUB = """ <li>Phone alerts (calls/SMS) are {0}</li> <li>Email alerts are {1}</li> -<li><span class="text-monospace">LVAlert</span> messages to <span class="text-monospace">{2}</span> are {3}</li> +<li><span class="text-monospace">igwn-alert</span> messages to <span class="text-monospace">{2}</span> are {3}</li> """ INSTANCE_LIST = INSTANCE_STUB.format(ENABLED[SEND_PHONE_ALERTS], ENABLED[SEND_EMAIL_ALERTS], LVALERT_OVERSEER_INSTANCES[0]['lvalert_server'], ENABLED[SEND_XMPP_ALERTS]) - -if (len(LVALERT_OVERSEER_INSTANCES) == 2): - IGWN_STUB = '<li><span class="text-monospace">igwn-alert</span> messages to <span class="text-monospace">{0}</span> are {1}</li>' - IGWN_LIST = IGWN_STUB.format(LVALERT_OVERSEER_INSTANCES[1]['lvalert_server'], - ENABLED[SEND_XMPP_ALERTS]) - INSTANCE_LIST = INSTANCE_LIST + IGWN_LIST - diff --git a/docker/supervisord-lvalert-overseer.conf b/docker/supervisord-lvalert-overseer.conf deleted file mode 100644 index 598c4c81d114ab20d11fba561a932e7413e39881..0000000000000000000000000000000000000000 --- a/docker/supervisord-lvalert-overseer.conf +++ /dev/null @@ -1,14 +0,0 @@ -[program:overseer] -autostart=%(ENV_ENABLE_OVERSEER)s -command=lvalert_overseer -a %(ENV_LVALERT_USER)s -b %(ENV_LVALERT_PASSWORD)s - -s %(ENV_LVALERT_SERVER)s -p %(ENV_LVALERT_OVERSEER_PORT)s - -r %(ENV_LVALERT_OVERSEER_RESOURCE)s - -l - -e - -user=gracedb -group=www-data -stdout_logfile=/dev/stdout -stdout_logfile_maxbytes=0 -redirect_stderr=true -priority=2 -autorestart=true -startretries=100 diff --git a/gracedb/alerts/lvalert.py b/gracedb/alerts/lvalert.py index 3829f81413f5c1a474e8e9deeeb31238b439c864..8bcc3eabcd80c308e62384f5ba665b235ec9a07a 100644 --- a/gracedb/alerts/lvalert.py +++ b/gracedb/alerts/lvalert.py @@ -3,8 +3,9 @@ from multiprocessing import Process import os from subprocess import Popen, PIPE -from ligo.lvalert import LVAlertClient -from ligo.overseer.overseer_client import send_to_overseer +from django.conf import settings +from igwn_alert import client +from igwn_alert_overseer.overseer.overseer_client import send_to_overseer # Set up logger logger = logging.getLogger(__name__) @@ -33,8 +34,8 @@ def send_with_lvalert_overseer(node_name, message, manager, port): return True if rdict.get('success', None) is not None else False -def send_with_lvalert_client(node, message, server, username=None, - password=None, **kwargs): +def send_with_kafka_client(node, message, server, username=None, + password=None, group=None, **kwargs): # Set up for initializing LVAlertClient instance client_settings = { @@ -43,44 +44,21 @@ def send_with_lvalert_client(node, message, server, username=None, # Username and password should be provided for container deployments. # For VMs, they won't be, so it will look up the credentials in the - # .netrc file + # hop auth.toml file if username is not None: client_settings['username'] = username if password is not None: client_settings['password'] = password + # if for some reason the group didn't get set correctly, make it the + # default + if group is not None: + client_settings['group'] = group + else: + client_settings['group'] = settings.DEFAULT_IGWN_ALERT_GROUP # Instantiate client - client = LVAlertClient(**client_settings) - - # Client setup - client.connect(reattempt=False) - client.auto_reconnect = False - client.process(block=False) + igwn_alert_client = client(**client_settings) # Send message - client.publish(node, message) - - # Disconnect - client.abort() - - -# OLD -def send_with_lvalert_send(node, message, server): - - # Set up environment for running lvalert_send executable - env = os.environ.copy() - - # Construct LVAlert command - cmd = [ - "lvalert_send", - "--server={server}".format(server=server), - "--file=-", - "--node={node}".format(node=node) - ] - - # Execute command - p = Popen(cmd, stdin=PIPE, stdout=PIPE, stderr=PIPE, env=env) - out, err = p.communicate(message) + igwn_alert_client.publish(topic=node, msg=message) - success = True if p.returncode == 0 else False - return success, err diff --git a/gracedb/alerts/xmpp.py b/gracedb/alerts/xmpp.py index 3272bd677d24167cd4e35a851fc7ddf33854e8f9..789e3e841a4e00eb97acd0bc00a73460f28ec610 100644 --- a/gracedb/alerts/xmpp.py +++ b/gracedb/alerts/xmpp.py @@ -14,7 +14,7 @@ from core.time_utils import gpsToUtc from events.permission_utils import is_external from events.shortcuts import is_event from superevents.shortcuts import is_superevent -from .lvalert import send_with_lvalert_overseer, send_with_lvalert_client +from .lvalert import send_with_lvalert_overseer, send_with_kafka_client # Set up logger logger = logging.getLogger(__name__) @@ -115,7 +115,7 @@ def issue_xmpp_alerts(event_or_superevent, alert_type, serialized_object, message_id = sha1((node_name + msg).encode()).hexdigest() # Log message - logger.info(("issue_xmpp_alerts: sending alert type {alert_type} " + logger.info(("issue_kafka_alerts: sending alert type {alert_type} " "with message {msg_id} for {uid} to {node} on {server}").format( alert_type=alert_type, msg_id=message_id, uid=uid, node=node_name, server=server)) @@ -130,18 +130,21 @@ def issue_xmpp_alerts(event_or_superevent, alert_type, serialized_object, # If not success, we need to do this the old way. if not success: - logger.critical(("issue_xmpp_alerts: sending message with " - "LVAlert Overseer failed, trying lvalert_send")) + logger.critical(("issue_kafka_alerts: sending message with " + "Overseer failed, trying igwn-alert client code")) - # If not using LVAlert Overseer or if sending with overseer failed, - # use basic lvalert-client send + # If not using Overseer or if sending with overseer failed, + # use basic igwn-alert client send if (not settings.USE_LVALERT_OVERSEER) or (not success): try: + # Make a settings dictionary and then change some names: lvalert_settings_dict = copy.deepcopy(overseer_instance) - server = lvalert_settings_dict.pop('lvalert_server') - send_with_lvalert_client(node_name, msg, server, + port = lvalert_settings_dict.pop('listen_port') + server = lvalert_settings_dict.pop('lvalert_server') + lvalert_settings_dict['group'] = lvalert_settings_dict.pop('igwn_alert_group') + send_with_kafka_client(node_name, msg, server, **lvalert_settings_dict) except Exception as e: - logger.critical(("issue_xmpp_alerts: error sending " - "message with lvalert client: {e}").format(e=e)) + logger.critical(("issue_kafka_alerts: error sending " + "message with igwn-alert client: {e}").format(e=e)) diff --git a/requirements.txt b/requirements.txt index a7f282f80560503303279e9809865b51057800cf..fb6bb51927738908dd8125e7aabba098bca8fe2a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -18,16 +18,12 @@ gpstime==0.5.5 gssapi==1.6.14 gunicorn==20.0.4 html5lib==1.1.0 +igwn-alert-overseer==0.5.1 ipdb==0.13.6 ipython==7.21.0 Jinja2==3.0.1 lalsuite==6.82 # undocumented requirement for lscsoft-glue python-ligo-lw==1.7.1 # adding support ligo un-ilwdchar'ed events -ligo-lvalert==1.5.6 -# Temporary pin of lvalert-overseer for Python 3 update -git+https://git.ligo.org/lscsoft/lvalert-overseer.git@e905ed8c888fcc8f31eb881cbfed7c5d7d1612a3#egg=ligo-lvalert-overseer -# Temporary pin of igwn_alert_overseer (kafka update) -git+https://git.ligo.org/lscsoft/lvalert-overseer.git@27d29599d2c079d8df3a8049e159bb03ba974a4a lscsoft-glue==2.0.0 lxml==4.6.0 matplotlib==3.3.4