Add state_reason on GW failure

Signed-off-by: Valerij Maljulin <vmaljuli@redhat.com>
This commit is contained in:
Valerij Maljulin
2019-05-27 14:09:57 +02:00
parent cde8d8058d
commit f0dc0b851d
5 changed files with 30 additions and 7 deletions

View File

@@ -48,6 +48,7 @@ import six.moves.xmlrpc_client as xmlrpclib
import logging
import os
import time
from datetime import datetime
logging.basicConfig(level=logging.DEBUG)
@@ -137,7 +138,12 @@ def done(config, session, msg):
if not build.scratch:
if greenwave is None or greenwave.check_gating(build):
build.transition(config, state="ready")
session.commit()
else:
build.state_reason = "Gating failed"
if greenwave.error_occurred:
build.state_reason += " (Error occured while querying Greenwave)"
build.time_modified = datetime.utcnow()
session.commit()
build_logs.stop(build)
module_build_service.builder.GenericBuilder.clear_cache(build)

View File

@@ -488,4 +488,11 @@ class MBSProducer(PollingProducer):
for build in module_builds:
if greenwave.check_gating(build):
build.transition(config, state=models.BUILD_STATES["ready"])
session.commit()
else:
build.state_reason = "Gating failed (MBS will retry in {0} seconds)".format(
conf.polling_interval
)
if greenwave.error_occurred:
build.state_reason += " (Error occured while querying Greenwave)"
build.time_modified = datetime.utcnow()
session.commit()

View File

@@ -37,9 +37,10 @@ class Greenwave(object):
self.url = conf.greenwave_url
self._decision_context = conf.greenwave_decision_context
if not self.decision_context:
raise GreenwaveError("No Greenwave decision context set")
raise RuntimeError("No Greenwave decision context set")
self._subj_type = conf.greenwave_subject_type
self._gw_timeout = conf.greenwave_timeout
self.error_occurred = False
def _greenwave_query(self, query_type, payload=None):
"""
@@ -63,7 +64,7 @@ class Greenwave(object):
except requests.exceptions.Timeout:
raise GreenwaveError("Greenwave request timed out")
except Exception as exc:
error_message = "Unspecified greenwave request error" \
error_message = "Unspecified greenwave request error " \
'(original exception was: "{0}")'.format(str(exc))
log.exception(error_message)
raise GreenwaveError(error_message)
@@ -156,10 +157,12 @@ class Greenwave(object):
:return: True if at least one GW response contains policies_satisfied set to true
:rtype: bool
"""
self.error_occurred = False
try:
versions = self.get_product_versions()
except GreenwaveError:
log.warning('An error occured while getting a product versions')
self.error_occurred = True
return False
for ver in versions:
@@ -168,6 +171,7 @@ class Greenwave(object):
# at least one positive result is enough
return True
except (KeyError, GreenwaveError) as exc:
self.error_occurred = True
log.warning('Incorrect greenwave result "%s", ignoring', str(exc))
return False
@@ -180,7 +184,7 @@ class Greenwave(object):
def url(self, value):
value = value.rstrip("/")
if not value:
raise GreenwaveError("No Greenwave URL set")
raise RuntimeError("No Greenwave URL set")
self._url = value
@property
@@ -202,6 +206,6 @@ class Greenwave(object):
try:
greenwave = Greenwave()
except GreenwaveError:
except RuntimeError:
log.warning('Greenwave is not configured or configured improperly')
greenwave = None

View File

@@ -528,6 +528,7 @@ class TestBuild:
assert module_build.state == models.BUILD_STATES["ready"]
else:
assert module_build.state == models.BUILD_STATES["done"]
assert module_build.state_reason == "Gating failed"
@patch(
"module_build_service.config.Config.check_for_eol",

View File

@@ -18,6 +18,7 @@
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
# SOFTWARE.
import re
import pytest
from mock import patch
from module_build_service import models, conf
@@ -666,4 +667,8 @@ class TestPoller:
assert set([m.id for m in module]) == {1, 2}
else:
assert len(module) == 1
assert set([m.id for m in module]) == {1}
assert module[0].id == 1
module = models.ModuleBuild.query.filter_by(state=models.BUILD_STATES["done"]).all()
assert len(module) == 1
assert module[0].id == 2
assert re.match("Gating failed.*", module[0].state_reason)