#386 Add support for manual dependent rebuilds on existing events
Merged 4 years ago by jkaluza. Opened 4 years ago by yashn.

file modified
+4 -1
@@ -317,7 +317,7 @@ 

      """

  

      def __init__(self, msg_id, advisory, container_images,

-                  requester_metadata_json=None, **kwargs):

+                  requester_metadata_json=None, freshmaker_event_id=None, **kwargs):

          """

          Creates new ManualRebuildWithAdvisoryEvent.

  
@@ -325,11 +325,14 @@ 

          :param ErrataAdvisory advisory: Errata advisory associated with event.

          :param list container_images: List of NVRs of images to rebuild or

              empty list to rebuild all images affected by the advisory.

+         :param freshmaker_event_id: Freshmaker event id on which this manual rebuild

+             is based off on.

          """

          super(ManualRebuildWithAdvisoryEvent, self).__init__(

              msg_id, advisory, **kwargs)

          self.container_images = container_images

          self.requester_metadata_json = requester_metadata_json

+         self.freshmaker_event_id = freshmaker_event_id

  

  

  class BrewSignRPMEvent(BaseEvent):

file modified
+4
@@ -244,6 +244,10 @@ 

          return session.query(cls).filter(cls.released == false(),

                                           cls.state.in_(states)).all()

  

+     @classmethod

+     def get_by_event_id(cls, session, event_id):

+         return session.query(cls).filter_by(id=event_id).first()

+ 

      def get_image_builds_in_first_batch(self, session):

          return session.query(ArtifactBuild).filter_by(

              dep_on=None,

@@ -52,7 +52,7 @@ 

  

          event = ManualRebuildWithAdvisoryEvent(

              msg_id, advisory, data.get("container_images", []), data.get("metadata", None),

-             manual=True, dry_run=dry_run)

+             freshmaker_event_id=data.get('freshmaker_event_id'), manual=True, dry_run=dry_run)

  

          return event

  

file modified
+9
@@ -329,6 +329,10 @@ 

          parser = FreshmakerManualRebuildParser()

          event = parser.parse_post_data(data)

  

+         dependent_event = None

+         if event.freshmaker_event_id:

+             dependent_event = models.Event.get_by_event_id(db.session, event.freshmaker_event_id)

+ 

          # Store the event into database, so it gets the ID which we can return

          # to client sending this POST request. The client can then use the ID

          # to check for the event status.
@@ -337,6 +341,11 @@ 

          db_event.requested_rebuilds = " ".join(event.container_images)

          if event.requester_metadata_json:

              db_event.requester_metadata = json.dumps(event.requester_metadata_json)

+         if dependent_event:

+             dependency = db_event.add_event_dependency(db.session, dependent_event)

+             if not dependency:

+                 log.warn('Dependency between {} and {} could not be added!'.format(

+                     event.freshmaker_event_id, dependent_event.id))

          db.session.commit()

  

          # Forward the POST data (including the msg_id of the database event we

file modified
+30
@@ -620,6 +620,36 @@ 

              {'msg_id': 'manual_rebuild_123', u'errata_id': 1,

               'metadata': {"foo": ["bar"]}})

  

+     @patch('freshmaker.messaging.publish')

+     @patch('freshmaker.parsers.internal.manual_rebuild.ErrataAdvisory.'

+            'from_advisory_id')

+     @patch('freshmaker.parsers.internal.manual_rebuild.time.time')

+     @patch('freshmaker.models.Event.add_event_dependency')

+     def test_dependent_manual_rebuild_on_existing_event(self, add_dependency, time,

+                                                         from_advisory_id, publish):

+         models.Event.create(db.session,

+                             "2017-00000000-0000-0000-0000-000000000003",

+                             "RHSA-2018-103", events.TestingEvent)

+         db.session.commit()

+         time.return_value = 123

+         from_advisory_id.return_value = ErrataAdvisory(

+             123, 'name', 'REL_PREP', ['rpm'])

+ 

+         resp = self.client.post(

+             '/api/1/builds/', data=json.dumps({

+                 'errata_id': 1, 'container_images': ["foo-1-1"],

+                 'freshmaker_event_id': 1}),

+             content_type='application/json')

+         data = json.loads(resp.get_data(as_text=True))

+         # Other fields are predictible.

+         self.assertEqual(data['requested_rebuilds'], ["foo-1-1"])

+         assert add_dependency.call_count == 1

+         assert "RHSA-2018-103" == add_dependency.call_args.args[1].search_key

+         publish.assert_called_once_with(

+             'manual.rebuild',

+             {'msg_id': 'manual_rebuild_123', u'errata_id': 1,

+              'container_images': ["foo-1-1"], 'freshmaker_event_id': 1})

+ 

  

  class TestOpenIDCLogin(ViewBaseTest):

      """Test that OpenIDC login"""

Allows users to submit manual Freshmaker event which will be based on the existing Freshmaker event.

I was wondering if there's a better alternative to support fetching an event by event_id

Maybe just simply add another method get_by_id or get_by_event_id.

Yeah, I think get_by_event_id would make sense.

This looks good, I think what @cqi suggested with get_by_event_id makes sense. Once this is done, +1 to merge.

Hm, not sure why tests failed here in unrelated part of code. Let's see if it fails also on rebase later.

rebased onto c73a853

4 years ago

Thank you @cqi and @jkaluza, I made the changes. Can you PTAL? :)

pretty please pagure-ci rebuild

4 years ago

Tests are passing now :). merging.

Commit bbceca2 fixes this pull-request

Pull-Request has been merged by jkaluza

4 years ago

Pull-Request has been merged by jkaluza

4 years ago