#111 Waive the absence of a result
Closed 6 years ago by ralph. Opened 6 years ago by gnaponie.
gnaponie/greenwave noresult  into  master

file modified
+3 -2
@@ -141,9 +141,10 @@ 

          response.raise_for_status()

          return response.json()

  

-     def create_waiver(self, result_id, product_version, waived=True):

+     def create_waiver(self, result, product_version, waived=True):

          data = {

-             'result_id': result_id,

+             'result_subject': result['subject'],

+             'result_testcase': result['testcase'],

              'product_version': product_version,

              'waived': waived,

          }

@@ -28,7 +28,10 @@ 

          testdatabuilder.create_result(item=nvr,

                                        testcase_name=testcase_name,

                                        outcome='PASSED')

-     waiver = testdatabuilder.create_waiver(result_id=result['id'], product_version='fedora-26')

+     testcase = str(result['testcase']['name'])

+     waiver = testdatabuilder.create_waiver(result={

+         "subject": dict([(str(key), str(value[0])) for key, value in result['data'].items()]),

+         "testcase": testcase}, product_version='fedora-26')

      message = {

          'body': {

              'topic': 'waiver.new',
@@ -39,7 +42,8 @@ 

                  "waived": "true",

                  "timestamp": "2017-08-10T17:42:04.209638",

                  "product_version": "fedora-26",

-                 "result_id": result['id'],

+                 "result_testcase": waiver['result_testcase'],

+                 "result_subject": [waiver['result_subject']]

              }

          }

      }
@@ -64,10 +68,11 @@ 

      assert old_decision['summary'] == '1 of 3 required tests failed'

  

      msg = {

+         'applicable_policies': ['taskotron_release_critical_tasks_with_blacklist',

+                                 'taskotron_release_critical_tasks'],

          'policies_satisfied': True,

          'decision_context': 'bodhi_update_push_stable',

-         'unsatisfied_requirements': [],

-         'summary': 'all required tests passed',

+         'previous': old_decision,

          'product_version': 'fedora-26',

          'subject': [

              {
@@ -75,9 +80,9 @@ 

                  'type': 'koji_build'

              }

          ],

-         'applicable_policies': ['taskotron_release_critical_tasks_with_blacklist',

-                                 'taskotron_release_critical_tasks'],

-         'previous': old_decision,

+         'unsatisfied_requirements': [],

+         'summary': 'all required tests passed',

+         'result_testcase': testcase,

      }

      mock_fedmsg.assert_called_once_with(

          topic='decision.update', msg=msg)

file modified
+45 -32
@@ -83,9 +83,6 @@ 

      'dist.upgradepath',

  ]

  

- OPENQA_TASKS = [

-     'compose.install_no_user',

- ]

  OPENQA_SCENARIOS = [

      'scenario1',

      'scenario2',
@@ -193,6 +190,7 @@ 

          'product_version': 'rhel-7',

          'subject': [{'item': nvr, 'type': 'koji_build'}]

      }

+ 

      r = requests_session.post(greenwave_server.url + 'api/v1.0/decision',

                                headers={'Content-Type': 'application/json'},

                                data=json.dumps(data))
@@ -211,7 +209,9 @@ 

      result = testdatabuilder.create_result(item=nvr,

                                             testcase_name=all_rpmdiff_testcase_names[0],

                                             outcome='FAILED')

-     testdatabuilder.create_waiver(result_id=result['id'], product_version='rhel-7')

+     waiver = testdatabuilder.create_waiver(result={ # noqa

+         "subject": dict([(key, value[0]) for key, value in result['data'].items()]),

+         "testcase": all_rpmdiff_testcase_names[0]}, product_version='rhel-7')

      # The rest passed

      for testcase_name in all_rpmdiff_testcase_names[1:]:

          testdatabuilder.create_result(item=nvr,
@@ -440,12 +440,13 @@ 

      If we require two scenarios to pass, and both pass, then we pass.

      """

      compose_id = testdatabuilder.unique_compose_id()

-     for testcase_name in OPENQA_TASKS:

-         for scenario in OPENQA_SCENARIOS:

-             testdatabuilder.create_result(item=compose_id,

-                                           testcase_name=testcase_name,

-                                           scenario=scenario,

-                                           outcome='PASSED')

+     testcase_name = 'compose.install_no_user'

+     for scenario in OPENQA_SCENARIOS:

+         testdatabuilder.create_result(

+             item=compose_id,

+             testcase_name=testcase_name,

+             scenario=scenario,

+             outcome='PASSED')

      data = {

          'decision_context': 'rawhide_compose_sync_to_mirrors',

          'product_version': 'fedora-rawhide',
@@ -469,17 +470,19 @@ 

      """

  

      compose_id = testdatabuilder.unique_compose_id()

-     for testcase_name in OPENQA_TASKS:

-         # Scenario 1 passes..

-         testdatabuilder.create_result(item=compose_id,

-                                       testcase_name=testcase_name,

-                                       scenario='scenario1',

-                                       outcome='PASSED')

-         # But scenario 2 fails!

-         testdatabuilder.create_result(item=compose_id,

-                                       testcase_name=testcase_name,

-                                       scenario='scenario2',

-                                       outcome='FAILED')

+     testcase_name = 'compose.install_no_user'

+     # Scenario 1 passes..

+     testdatabuilder.create_result(

+         item=compose_id,

+         testcase_name=testcase_name,

+         scenario='scenario1',

+         outcome='PASSED')

+     # But scenario 2 fails!

+     result = testdatabuilder.create_result(

+         item=compose_id,

+         testcase_name=testcase_name,

+         scenario='scenario2',

+         outcome='FAILED')

      data = {

          'decision_context': 'rawhide_compose_sync_to_mirrors',

          'product_version': 'fedora-rawhide',
@@ -494,6 +497,14 @@ 

      assert res_data['applicable_policies'] == ['openqa_important_stuff_for_rawhide']

      expected_summary = '1 of 2 required tests failed'

      assert res_data['summary'] == expected_summary

+     expected_unsatisfied_requirements = [{

+         u'item': {u'item': compose_id},

+         u'result_id': result['id'],

+         u'testcase': testcase_name,

+         u'type': u'test-result-failed',

+         u'scenario': u'scenario2',

+     }]

+     assert res_data['unsatisfied_requirements'] == expected_unsatisfied_requirements

  

  

  def test_ignore_waiver(requests_session, greenwave_server, testdatabuilder):
@@ -504,7 +515,9 @@ 

      result = testdatabuilder.create_result(item=nvr,

                                             testcase_name=all_rpmdiff_testcase_names[0],

                                             outcome='FAILED')

-     waiver = testdatabuilder.create_waiver(result_id=result['id'], product_version='rhel-7')

+     waiver = testdatabuilder.create_waiver(result={

+         "subject": dict([(key, value[0]) for key, value in result['data'].items()]),

+         "testcase": all_rpmdiff_testcase_names[0]}, product_version='rhel-7')

      # The rest passed

      for testcase_name in all_rpmdiff_testcase_names[1:]:

          testdatabuilder.create_result(item=nvr,
@@ -515,21 +528,21 @@ 

          'product_version': 'rhel-7',

          'subject': [{'item': nvr, 'type': 'koji_build'}]

      }

-     r = requests_session.post(greenwave_server.url + 'api/v1.0/decision',

-                               headers={'Content-Type': 'application/json'},

-                               data=json.dumps(data))

-     assert r.status_code == 200

-     res_data = r.json()

+     r_ = requests_session.post(greenwave_server.url + 'api/v1.0/decision',

+                                headers={'Content-Type': 'application/json'},

+                                data=json.dumps(data))

+     assert r_.status_code == 200

+     res_data = r_.json()

      assert res_data['policies_satisfied'] is True

      # Ignore the waiver

      data.update({

          'ignore_waiver': [waiver['id']]

      })

-     r = requests_session.post(greenwave_server.url + 'api/v1.0/decision',

-                               headers={'Content-Type': 'application/json'},

-                               data=json.dumps(data))

-     assert r.status_code == 200

-     res_data = r.json()

+     r_ = requests_session.post(greenwave_server.url + 'api/v1.0/decision',

+                                headers={'Content-Type': 'application/json'},

+                                data=json.dumps(data))

+     assert r_.status_code == 200

+     res_data = r_.json()

      expected_unsatisfied_requirements = [

          {

              'item': {'item': nvr, 'type': 'koji_build'},

file modified
+3 -4
@@ -199,13 +199,12 @@ 

      if not subjects:

          raise BadRequest('Invalid subject, must be a list of dicts')

      answers = []

+ 

      for item in subjects:

          results = retrieve_results(item)

          results = [r for r in results if r['id'] not in ignore_results]

-         if results:

-             waivers = retrieve_waivers(product_version, results)

-         else:

-             waivers = []

+ 

+         waivers = retrieve_waivers(product_version, item)

          waivers = [w for w in waivers if w['id'] not in ignore_waivers]

          for policy in applicable_policies:

              answers.extend(policy.check(item, results, waivers))

@@ -61,27 +61,17 @@ 

          message = message.get('body', message)

          log.debug('Processing message "%s"', message)

          msg = message['msg']

-         result_id = msg['result_id']

+ 

          product_version = msg['product_version']

          config = load_config()

-         timeout = config['REQUESTS_TIMEOUT']

-         # Get the waived result to figure out the item

-         response = requests_session.get(

-             config['RESULTSDB_API_URL'] + '/results/%d' % result_id,

-             timeout=timeout)

-         response.raise_for_status()

-         testcase = response.json()['testcase']['name']

-         # In ResultsDB, 'data' is key -> list of strings.

-         # But in Greenwave, we only deal in key -> string.

-         # This is... iffy and might need cleaning up?

-         item = {k: v[0] for k, v in response.json()['data'].items()}

+         testcase = msg['result_testcase']

          for policy in config['policies']:

              for rule in policy.rules:

                  if rule.test_case_name == testcase:

                      data = {

                          'decision_context': policy.decision_context,

                          'product_version': product_version,

-                         'subject': [item],

+                         'subject': msg['result_subject']

                      }

                      response = requests_session.post(

                          self.fedmsg_config['greenwave_api_url'] + '/decision',
@@ -101,9 +91,12 @@ 

                      old_decision = response.json()

  

                      if decision != old_decision:

+                         subject = [dict((str(k), str(v)) for k, v in item.items())

+                                    for item in msg['result_subject']]

                          msg = decision

                          decision.update({

-                             'subject': [item],

+                             'subject': subject,

+                             'result_testcase': testcase,

                              'decision_context': policy.decision_context,

                              'product_version': product_version,

                              'previous': old_decision,

file modified
+4 -1
@@ -166,7 +166,10 @@ 

          if matching_result['outcome'] in ['PASSED', 'INFO']:

              return RuleSatisfied()

          # XXX limit who is allowed to waive

-         if any(w['result_id'] == matching_result['id'] and w['waived'] for w in waivers):

+         if any(w['result_subject'] == dict([(key, value[0])

+                for key, value in matching_result['data'].items()]) and

+                w['result_testcase'] == matching_result['testcase']['name'] and

+                w['waived'] for w in waivers):

              return RuleSatisfied()

          return TestResultFailed(item, self.test_case_name, self._scenario, matching_result['id'])

  

file modified
+5 -3
@@ -6,6 +6,7 @@ 

  

  """

  

+ import pdb

  import requests

  import json

  from flask import current_app
@@ -30,16 +31,17 @@ 

  

  

  # NOTE - not cached, for now.

- def retrieve_waivers(product_version, results):

+ def retrieve_waivers(product_version, item):

      timeout = current_app.config['REQUESTS_TIMEOUT']

      data = {

          'product_version': product_version,

-         'result_ids': [result['id'] for result in results],

+         'results': [{'subject': item}]

      }

      response = requests_session.post(

-         current_app.config['WAIVERDB_API_URL'] + '/waivers/+by-result-ids',

+         current_app.config['WAIVERDB_API_URL'] + '/waivers/+by-subjects-and-testcases',

          headers={'Content-Type': 'application/json'},

          data=json.dumps(data),

          timeout=timeout)

      response.raise_for_status()

+     #pdb.set_trace()

      return response.json()['data']

Changed Greenwave for submition of waiver in Waiverdb, not anymore with the result_id, but with subject and testcase

For consistency, I'd use single quotes here since the rest of the function uses single quotes.

Actually nowhere. I must have added it at some point and then forgot it was there...

1 new commit added

  • minor fixes
6 years ago

Pull-Request has been closed by ralph

6 years ago