Commit c7c26219 authored by Łukasz Nowak's avatar Łukasz Nowak Committed by Łukasz Nowak

promise/plugin: Generally improve check_url_available

Improvements:

 * flake8ize test_check_url_available and check_url_available
 * cover more of check_url_available
parent cd0fb8f8
from zope import interface as zope_interface from zope import interface as zope_interface
from slapos.grid.promise import interface from slapos.grid.promise import interface
from slapos.grid.promise.generic import GenericPromise from slapos.grid.promise.generic import GenericPromise
import os
import requests import requests
class RunPromise(GenericPromise): class RunPromise(GenericPromise):
zope_interface.implements(interface.IPromise) zope_interface.implements(interface.IPromise)
...@@ -36,7 +37,8 @@ class RunPromise(GenericPromise): ...@@ -36,7 +37,8 @@ class RunPromise(GenericPromise):
cert = None cert = None
try: try:
result = requests.get(url, verify=verify, allow_redirects=True, timeout=timeout, cert=cert) result = requests.get(
url, verify=verify, allow_redirects=True, timeout=timeout, cert=cert)
except requests.ConnectionError as e: except requests.ConnectionError as e:
self.logger.error( self.logger.error(
"ERROR connection not possible while accessing %r" % (url, )) "ERROR connection not possible while accessing %r" % (url, ))
...@@ -46,18 +48,18 @@ class RunPromise(GenericPromise): ...@@ -46,18 +48,18 @@ class RunPromise(GenericPromise):
return return
http_code = result.status_code http_code = result.status_code
check_secure = self.getConfig('check-secure') check_secure = int(self.getConfig('check-secure', 0))
if http_code == 0: if http_code == 0:
self.logger.error("%s is not available (server not reachable)." % url) self.logger.error("%s is not available (server not reachable)." % url)
elif http_code == 401 and check_secure == "1": elif http_code == 401 and check_secure == 1:
self.logger.info("%s is protected (returned %s)." % (url, http_code)) self.logger.info("%r is protected (returned %s)." % (url, http_code))
elif http_code != expected_http_code: elif http_code != expected_http_code:
self.logger.error("%s is not available (returned %s, expected %s)." % ( self.logger.error("%r is not available (returned %s, expected %s)." % (
url, http_code, expected_http_code)) url, http_code, expected_http_code))
else: else:
self.logger.info("%s: URL is available" % http_code) self.logger.info("%r is available" % (url,))
def anomaly(self): def anomaly(self):
return self._test(result_count=3, failure_amount=3) return self._test(result_count=3, failure_amount=3)
############################################################################## ##############################################################################
# #
# Copyright (c) 2018 Vifib SARL and Contributors. All Rights Reserved. # Copyright (c) 2019 Vifib SARL and Contributors. All Rights Reserved.
# #
# WARNING: This program as such is intended to be used by professional # WARNING: This program as such is intended to be used by professional
# programmers who take the whole responsibility of assessing all potential # programmers who take the whole responsibility of assessing all potential
...@@ -25,12 +25,52 @@ ...@@ -25,12 +25,52 @@
# #
############################################################################## ##############################################################################
from slapos.test.promise.plugin import TestPromisePluginMixin
from slapos.grid.promise import PromiseError from slapos.grid.promise import PromiseError
import os from slapos.test.promise.plugin import TestPromisePluginMixin
import BaseHTTPServer
import json
import multiprocessing
import time
import unittest
SLAPOS_TEST_IPV4 = '127.0.0.1'
SLAPOS_TEST_IPV4_PORT = 57965
HTTPS_ENDPOINT = "http://%s:%s/" % (SLAPOS_TEST_IPV4, SLAPOS_TEST_IPV4_PORT)
class TestHandler(BaseHTTPServer.BaseHTTPRequestHandler):
def do_GET(self):
timeout = int(self.headers.dict.get('timeout', '0'))
time.sleep(timeout)
response = int(self.path.split('/')[-1])
self.send_response(response)
self.send_header("Content-type", "application/json")
self.end_headers()
response = {
'Path': self.path,
}
self.wfile.write(json.dumps(response, indent=2))
class TestCheckUrlAvailable(TestPromisePluginMixin): class TestCheckUrlAvailable(TestPromisePluginMixin):
@classmethod
def setUpClass(cls):
server = BaseHTTPServer.HTTPServer(
(SLAPOS_TEST_IPV4, SLAPOS_TEST_IPV4_PORT),
TestHandler)
cls.server_process = multiprocessing.Process(
target=server.serve_forever)
cls.server_process.start()
@classmethod
def tearDownClass(cls):
cls.server_process.terminate()
cls.server_process.join()
def setUp(self): def setUp(self):
TestPromisePluginMixin.setUp(self) TestPromisePluginMixin.setUp(self)
self.promise_name = "check-url-available.py" self.promise_name = "check-url-available.py"
...@@ -59,7 +99,10 @@ extra_config_dict = { ...@@ -59,7 +99,10 @@ extra_config_dict = {
self.launcher.run() self.launcher.run()
result = self.getPromiseResult(self.promise_name) result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], True) self.assertEqual(result['result']['failed'], True)
self.assertEqual(result['result']['message'], "ERROR: Invalid URL u'https://': No host supplied") self.assertEqual(
result['result']['message'],
"ERROR: Invalid URL u'https://': No host supplied"
)
def test_check_url_malformed(self): def test_check_url_malformed(self):
content = self.base_content % { content = self.base_content % {
...@@ -73,7 +116,10 @@ extra_config_dict = { ...@@ -73,7 +116,10 @@ extra_config_dict = {
self.launcher.run() self.launcher.run()
result = self.getPromiseResult(self.promise_name) result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], True) self.assertEqual(result['result']['failed'], True)
self.assertEqual(result['result']['message'], "ERROR: Invalid URL '': No schema supplied. Perhaps you meant http://?") self.assertEqual(
result['result']['message'],
"ERROR: Invalid URL '': No schema supplied. Perhaps you meant http://?"
)
def test_check_url_site_off(self): def test_check_url_site_off(self):
content = content = self.base_content % { content = content = self.base_content % {
...@@ -87,7 +133,64 @@ extra_config_dict = { ...@@ -87,7 +133,64 @@ extra_config_dict = {
self.launcher.run() self.launcher.run()
result = self.getPromiseResult(self.promise_name) result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], True) self.assertEqual(result['result']['failed'], True)
self.assertEqual(result['result']['message'], "ERROR connection not possible while accessing 'https://localhost:56789/site'") self.assertEqual(
result['result']['message'],
"ERROR connection not possible while accessing "
"'https://localhost:56789/site'"
)
def test_check_200(self):
url = HTTPS_ENDPOINT + '200'
content = content = self.base_content % {
'url': url,
'timeout': 10,
'check_secure': 0
}
self.writePromise(self.promise_name, content)
self.configureLauncher()
self.launcher.run()
result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], False)
self.assertEqual(
result['result']['message'],
"%r is available" % (url,)
)
def test_check_401(self):
url = HTTPS_ENDPOINT + '401'
content = content = self.base_content % {
'url': url,
'timeout': 10,
'check_secure': 0
}
self.writePromise(self.promise_name, content)
self.configureLauncher()
with self.assertRaises(PromiseError):
self.launcher.run()
result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], True)
self.assertEqual(
result['result']['message'],
"%r is not available (returned 401, expected 200)." % (url,)
)
def test_check_401_secure(self):
url = HTTPS_ENDPOINT + '401'
content = content = self.base_content % {
'url': url,
'timeout': 10,
'check_secure': 1
}
self.writePromise(self.promise_name, content)
self.configureLauncher()
self.launcher.run()
result = self.getPromiseResult(self.promise_name)
self.assertEqual(result['result']['failed'], False)
self.assertEqual(
result['result']['message'],
"%r is protected (returned 401)." % (url,)
)
if __name__ == '__main__': if __name__ == '__main__':
unittest.main() unittest.main()
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment