diff --git a/stack/resilient/buildout.cfg b/stack/resilient/buildout.cfg index 90f01a867100b20769ce855e665911725270cc7c..f0c034e54450a0508bec37697f4a0612be873623 100644 --- a/stack/resilient/buildout.cfg +++ b/stack/resilient/buildout.cfg @@ -14,6 +14,7 @@ parts = pbsready pbsready-import pbsready-export + notifier-feed-promise-template template-replicated template-parts instance-frozen @@ -41,7 +42,7 @@ eggs = recipe = slapos.recipe.template url = ${:_profile_base_location_}/pbsready.cfg.in output = ${buildout:directory}/pbsready.cfg -md5sum = dfaef2081cc08b0f046b6989f9a9462f +md5sum = 0df8fe9b69f7943c3d5a2d30d4640557 mode = 0644 [pbsready-import] @@ -50,7 +51,7 @@ mode = 0644 recipe = slapos.recipe.template url = ${:_profile_base_location_}/pbsready-import.cfg.in output = ${buildout:directory}/pbsready-import.cfg -md5sum = 9c3567ec52dcdb00ac1e8b2acd1941ff +md5sum = 5d5e4ad35c1a97ea5f7a15a4f5f766a8 mode = 0644 [pbsready-export] @@ -59,14 +60,14 @@ mode = 0644 recipe = slapos.recipe.build:download url = ${:_profile_base_location_}/pbsready-export.cfg.in filename = pbsready-export.cfg.in -md5sum = 6f912998b88de02ef52660e4a9c336f2 +md5sum = 1b38292c42702f91f620cb99d1a88952 mode = 0644 [template-pull-backup] recipe = slapos.recipe.template url = ${:_profile_base_location_}/instance-pull-backup.cfg.in output = ${buildout:directory}/instance-pull-backup.cfg -md5sum = e5642321d44c9a94383826b220df28ae +md5sum = 3063ab8d4b1e4a4133ec3893349cefaa mode = 0644 [template-replicated] @@ -115,6 +116,12 @@ output = ${buildout:directory}/template-wrapper.cfg mode = 0644 md5sum = 8cde04bfd0c0e9bd56744b988275cfd8 +[notifier-feed-promise-template] +recipe = slapos.recipe.build:download +url = ${:_profile_base_location_}/templates/notifier-feed-promise.py.in +md5sum = d75346911dbc4cfcdb39a21e56cd5016 +mode = 0644 + ################## # Monitor element # diff --git a/stack/resilient/instance-pull-backup.cfg.in b/stack/resilient/instance-pull-backup.cfg.in index c0f449bb116e2584aae87df1f02b61e2ad27b857..0a419987722aaf419b680917cdb3924c3ffd6a24 100644 --- a/stack/resilient/instance-pull-backup.cfg.in +++ b/stack/resilient/instance-pull-backup.cfg.in @@ -15,6 +15,7 @@ parts = backup-signature-link cron-pbs-status-feed pull-push-stalled-promise + notifier-feed-status-promise ## Monitor for pbs monitor-base @@ -320,6 +321,16 @@ recipe = slapos.cookbook:wrapper command-line = ${buildout:bin-directory}/check-feed-as-promise --feed-path $${pbs-resilient-status-feed:feed-path} --title --ok-pattern 'OK' --time-buffer 90000 wrapper-path = $${basedirectory:promises}/stalled-pull-push +[notifier-feed-status-promise] +recipe = slapos.recipe.template:jinja2 +template = ${notifier-feed-promise-template:target} +rendered = $${basedirectory:promises}/notifier-feed-check-malformed-or-failure.py +mode = 700 +context = + key notifier_feed_directory directory:notifier-feeds + raw base_url http://[$${notifier:host}]:$${notifier:port}/get/ + raw python_executable ${buildout:executable} + #---------------- #-- #-- Publish instance parameters. diff --git a/stack/resilient/pbsready-export.cfg.in b/stack/resilient/pbsready-export.cfg.in index 351478495ca0d92535732a07cd35fddf23e84b5a..71e5edceffb602be1bba9228e32d47f638aff767 100644 --- a/stack/resilient/pbsready-export.cfg.in +++ b/stack/resilient/pbsready-export.cfg.in @@ -12,6 +12,7 @@ parts = cron cron-entry-logrotate cron-entry-notifier-status-feed + notifier-feed-status-promise notifier-stalled-promise resilient-sshkeys-authority sshd-raw-server diff --git a/stack/resilient/pbsready-import.cfg.in b/stack/resilient/pbsready-import.cfg.in index aa313fea5591ceab0a46599c3e474090f4b11f5f..2140c57475c8fae0568d1a74599a6501191d244d 100644 --- a/stack/resilient/pbsready-import.cfg.in +++ b/stack/resilient/pbsready-import.cfg.in @@ -13,6 +13,7 @@ parts = cron cron-entry-logrotate cron-entry-notifier-status-feed + notifier-feed-status-promise notifier-stalled-promise resilient-sshkeys-authority sshd-raw-server diff --git a/stack/resilient/pbsready.cfg.in b/stack/resilient/pbsready.cfg.in index c1ced7544b477f171ce235f467362507a35991c7..a0aa6b29760302970db86841d7c418498c27d25f 100644 --- a/stack/resilient/pbsready.cfg.in +++ b/stack/resilient/pbsready.cfg.in @@ -9,6 +9,7 @@ parts = cron cron-entry-logrotate cron-entry-notifier-status-feed + notifier-feed-status-promise notifier-stalled-promise resilient-sshkeys-authority sshd-graceful @@ -306,6 +307,20 @@ input = inline:#!${bash:location}/bin/bash output = $${basedirectory:promises}/public-key-existence mode = 700 +#---------------- +#-- +#-- Promises + +[notifier-feed-status-promise] +recipe = slapos.recipe.template:jinja2 +template = ${notifier-feed-promise-template:target} +rendered = $${basedirectory:promises}/notifier-feed-check-malformed-or-failure.py +mode = 700 +context = + key notifier_feed_directory directory:notifier-feeds + raw base_url http://[$${notifier:host}]:$${notifier:port}/get/ + raw python_executable ${buildout:executable} + #---------------- #-- #-- Connection informations to re-use. diff --git a/stack/resilient/templates/notifier-feed-promise.py.in b/stack/resilient/templates/notifier-feed-promise.py.in new file mode 100644 index 0000000000000000000000000000000000000000..fb021dabe572a4e7980b369556a2ae04810d3fe2 --- /dev/null +++ b/stack/resilient/templates/notifier-feed-promise.py.in @@ -0,0 +1,37 @@ +#!{{ python_executable }} +import csv +import os +import sys +import urllib2 + +csv.field_size_limit(sys.maxsize) + +notifier_feed_directory = '{{ notifier_feed_directory }}' +base_url = "{{ base_url }}" + +feed_file_list = os.listdir(notifier_feed_directory) + +for feed_file_name in feed_file_list: + url = base_url + feed_file_name + # Try feed consistency + try: + feed = urllib2.urlopen(url) + body = feed.read() + except urllib2.HTTPError as e: + sys.exit("%s is unavailable: %s" % (feed_file_name, e)) + with open(os.path.join(notifier_feed_directory, feed_file_name)) as feed_file: + reader = csv.reader(feed_file) + # Get last row because we only care about last run + for row in reader: + pass + try: + timestamp, title, content, guid = row + if content.startswith('OK'): + continue + else: + sys.exit("Last run of %s failed" % feed_file_name) + except ValueError: + sys.exit("Notifier feed %s is malformed" % notifier_feed) + except NameError: + # row can be not defined if feed is empty + pass