)]}'
{"doc/notification_samples/aggregate-cache_images-progress.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":9,"context_line":"            \"uuid\": \"788608ec-ebdc-45c5-bc7f-e5f24ab92c80\","},{"line_number":10,"context_line":"            \"host\": \"compute\","},{"line_number":11,"context_line":"            \"total\": 1,"},{"line_number":12,"context_line":"            \"index\": 1,"},{"line_number":13,"context_line":"            \"images_cached\": [\"155d900f-4e14-4e4c-a73d-069cbf4541e6\"],"},{"line_number":14,"context_line":"            \"images_failed\": [],"},{"line_number":15,"context_line":"            \"id\": 1"}],"source_content_type":"application/json","patch_set":5,"id":"3fa7e38b_bc277c12","line":12,"updated":"2019-10-28 20:16:04.000000000","message":"I would have expected index to be 0 if there is one total, but I guess it makes sense if you think about it like index/total.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"65168f434cf2ab5e9adf874d80dfc73c9550f3e4","unresolved":false,"context_lines":[{"line_number":9,"context_line":"            \"uuid\": \"788608ec-ebdc-45c5-bc7f-e5f24ab92c80\","},{"line_number":10,"context_line":"            \"host\": \"compute\","},{"line_number":11,"context_line":"            \"total\": 1,"},{"line_number":12,"context_line":"            \"index\": 1,"},{"line_number":13,"context_line":"            \"images_cached\": [\"155d900f-4e14-4e4c-a73d-069cbf4541e6\"],"},{"line_number":14,"context_line":"            \"images_failed\": [],"},{"line_number":15,"context_line":"            \"id\": 1"}],"source_content_type":"application/json","patch_set":5,"id":"3fa7e38b_b2124357","line":12,"in_reply_to":"3fa7e38b_bc277c12","updated":"2019-10-28 20:45:20.000000000","message":"Yep, and I said N/M in the object field comments.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"}],"doc/notification_samples/common_payloads/AggregateCachePayload.json":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"78036c396f286f6e0cb78146d59248956982f4b6","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"my-aggregate\","},{"line_number":7,"context_line":"        \"uuid\": \"788608ec-ebdc-45c5-bc7f-e5f24ab92c80\","},{"line_number":8,"context_line":"        \"host\": \"my-compute\","},{"line_number":9,"context_line":"        \"total\": 1,"},{"line_number":10,"context_line":"        \"index\": 1,"},{"line_number":11,"context_line":"        \"images_cached\": [\"155d900f-4e14-4e4c-a73d-069cbf4541e6\"],"},{"line_number":12,"context_line":"        \"images_failed\": [],"},{"line_number":13,"context_line":"        \"id\": 1"},{"line_number":14,"context_line":"    }"},{"line_number":15,"context_line":"}"}],"source_content_type":"application/json","patch_set":3,"id":"3fa7e38b_ae551bc4","line":12,"range":{"start_line":8,"start_character":8,"end_line":12,"end_character":28},"updated":"2019-10-25 18:24:25.000000000","message":"It\u0027s a little weird to have this in the common payload file but the only thing you actually override is the host entry so maybe not a huge deal.","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"252783f35280308492124303da68105359249d04","unresolved":false,"context_lines":[{"line_number":5,"context_line":"    \"nova_object.data\": {"},{"line_number":6,"context_line":"        \"name\": \"my-aggregate\","},{"line_number":7,"context_line":"        \"uuid\": \"788608ec-ebdc-45c5-bc7f-e5f24ab92c80\","},{"line_number":8,"context_line":"        \"host\": \"my-compute\","},{"line_number":9,"context_line":"        \"total\": 1,"},{"line_number":10,"context_line":"        \"index\": 1,"},{"line_number":11,"context_line":"        \"images_cached\": [\"155d900f-4e14-4e4c-a73d-069cbf4541e6\"],"},{"line_number":12,"context_line":"        \"images_failed\": [],"},{"line_number":13,"context_line":"        \"id\": 1"},{"line_number":14,"context_line":"    }"},{"line_number":15,"context_line":"}"}],"source_content_type":"application/json","patch_set":3,"id":"3fa7e38b_95693cbf","line":12,"range":{"start_line":8,"start_character":8,"end_line":12,"end_character":28},"in_reply_to":"3fa7e38b_ae551bc4","updated":"2019-10-28 12:02:12.000000000","message":"common payloads are for pieces of json we dont want to repeat in multiple sample files. This is only used in one sample files I would even drop the common payload and inline the content of it to the sample file.","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"}],"nova/compute/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"252783f35280308492124303da68105359249d04","unresolved":false,"context_lines":[{"line_number":782,"context_line":"    :param host: The host within the aggregate for which to report status"},{"line_number":783,"context_line":"    :param image_status: The result from the compute host, which is a dict"},{"line_number":784,"context_line":"                         of {image_id: status}"},{"line_number":785,"context_line":"    :param index: An integer indictating progress toward completion, between"},{"line_number":786,"context_line":"                  1 and $total"},{"line_number":787,"context_line":"    :param total: The total number of hosts being processed in this operation,"},{"line_number":788,"context_line":"                  to bound $index"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_159b0cc9","line":785,"range":{"start_line":785,"start_character":29,"end_line":785,"end_character":40},"updated":"2019-10-28 12:02:12.000000000","message":"nit: indicating","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":789,"context_line":"    \"\"\""},{"line_number":790,"context_line":"    success_statuses \u003d (\u0027cached\u0027, \u0027existing\u0027)"},{"line_number":791,"context_line":"    payload \u003d aggregate_notification.AggregateCachePayload(aggregate)"},{"line_number":792,"context_line":"    payload.host \u003d host"},{"line_number":793,"context_line":"    payload.images_cached \u003d [img for img, status in image_status.items()"},{"line_number":794,"context_line":"                             if status in success_statuses]"},{"line_number":795,"context_line":"    payload.images_failed \u003d [img for img, status in image_status.items()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_5c67684e","line":792,"updated":"2019-10-28 20:16:04.000000000","message":"nit: I probably would have passed this into AggregateCachePayload to set it during init.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"65168f434cf2ab5e9adf874d80dfc73c9550f3e4","unresolved":false,"context_lines":[{"line_number":789,"context_line":"    \"\"\""},{"line_number":790,"context_line":"    success_statuses \u003d (\u0027cached\u0027, \u0027existing\u0027)"},{"line_number":791,"context_line":"    payload \u003d aggregate_notification.AggregateCachePayload(aggregate)"},{"line_number":792,"context_line":"    payload.host \u003d host"},{"line_number":793,"context_line":"    payload.images_cached \u003d [img for img, status in image_status.items()"},{"line_number":794,"context_line":"                             if status in success_statuses]"},{"line_number":795,"context_line":"    payload.images_failed \u003d [img for img, status in image_status.items()"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_120a371f","line":792,"in_reply_to":"3fa7e38b_5c67684e","updated":"2019-10-28 20:45:20.000000000","message":"Well, it wasn\u0027t clear to me whether or not that was conventionally appropriate as it seemed like the common case is to provide some object that the notification is digesting. I\u0027m also not sure why we\u0027d have an object with mutable fields and then expect to always set them via init. But, if that\u0027s most appropriate I can change.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":792,"context_line":"    payload.host \u003d host"},{"line_number":793,"context_line":"    payload.images_cached \u003d [img for img, status in image_status.items()"},{"line_number":794,"context_line":"                             if status in success_statuses]"},{"line_number":795,"context_line":"    payload.images_failed \u003d [img for img, status in image_status.items()"},{"line_number":796,"context_line":"                             if status not in success_statuses]"},{"line_number":797,"context_line":"    payload.index \u003d index"},{"line_number":798,"context_line":"    payload.total \u003d total"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_7c4b44b0","line":795,"updated":"2019-10-28 20:16:04.000000000","message":"nit: list comprehension is fun but we could avoid the double loops and just do a single loop to build both lists.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":794,"context_line":"                             if status in success_statuses]"},{"line_number":795,"context_line":"    payload.images_failed \u003d [img for img, status in image_status.items()"},{"line_number":796,"context_line":"                             if status not in success_statuses]"},{"line_number":797,"context_line":"    payload.index \u003d index"},{"line_number":798,"context_line":"    payload.total \u003d total"},{"line_number":799,"context_line":"    notification \u003d aggregate_notification.AggregateCacheNotification("},{"line_number":800,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":801,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_3cc70c15","line":798,"range":{"start_line":797,"start_character":4,"end_line":798,"end_character":25},"updated":"2019-10-28 20:16:04.000000000","message":"nit: I probably would have passed these through to the AggregateCachePayload.__init__ as well.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":799,"context_line":"    notification \u003d aggregate_notification.AggregateCacheNotification("},{"line_number":800,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":801,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("},{"line_number":802,"context_line":"            host\u003dCONF.host, source\u003dfields.NotificationSource.API),"},{"line_number":803,"context_line":"        event_type\u003dnotification_base.EventType("},{"line_number":804,"context_line":"            object\u003d\u0027aggregate\u0027,"},{"line_number":805,"context_line":"            action\u003dfields.NotificationAction.IMAGE_CACHE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fccc1435","line":802,"range":{"start_line":802,"start_character":61,"end_line":802,"end_character":64},"updated":"2019-10-28 20:16:04.000000000","message":"This should be CONDUCTOR.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"65168f434cf2ab5e9adf874d80dfc73c9550f3e4","unresolved":false,"context_lines":[{"line_number":799,"context_line":"    notification \u003d aggregate_notification.AggregateCacheNotification("},{"line_number":800,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":801,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("},{"line_number":802,"context_line":"            host\u003dCONF.host, source\u003dfields.NotificationSource.API),"},{"line_number":803,"context_line":"        event_type\u003dnotification_base.EventType("},{"line_number":804,"context_line":"            object\u003d\u0027aggregate\u0027,"},{"line_number":805,"context_line":"            action\u003dfields.NotificationAction.IMAGE_CACHE,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_32ff3302","line":802,"range":{"start_line":802,"start_character":61,"end_line":802,"end_character":64},"in_reply_to":"3fa7e38b_fccc1435","updated":"2019-10-28 20:45:20.000000000","message":"Oops, good call. I copied this from L766 just trying to figure this out and obviously never changed it.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"}],"nova/conductor/manager.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":1693,"context_line":"                                                       host_stats[\u0027completed\u0027],"},{"line_number":1694,"context_line":"                                                       host_stats[\u0027total\u0027])"},{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        def wrap_cache_images(context, host, image_ids):"},{"line_number":1697,"context_line":"            result \u003d self.compute_rpcapi.cache_images("},{"line_number":1698,"context_line":"                target_ctxt,"},{"line_number":1699,"context_line":"                host\u003dhost,"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_dcd7d8be","line":1696,"range":{"start_line":1696,"start_character":30,"end_line":1696,"end_character":37},"updated":"2019-10-28 20:16:04.000000000","message":"this...","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":1695,"context_line":""},{"line_number":1696,"context_line":"        def wrap_cache_images(context, host, image_ids):"},{"line_number":1697,"context_line":"            result \u003d self.compute_rpcapi.cache_images("},{"line_number":1698,"context_line":"                target_ctxt,"},{"line_number":1699,"context_line":"                host\u003dhost,"},{"line_number":1700,"context_line":"                image_ids\u003dimage_ids)"},{"line_number":1701,"context_line":"            host_completed(context, host, result)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_7ce02498","line":1698,"range":{"start_line":1698,"start_character":16,"end_line":1698,"end_character":27},"updated":"2019-10-28 20:16:04.000000000","message":"...and this should be consistent","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"867e4e02608d2c57fd94028cc3a4ca14f36c4127","unresolved":false,"context_lines":[{"line_number":1719,"context_line":"                            \u0027Skipping image pre-cache request to compute \u0027"},{"line_number":1720,"context_line":"                            \u0027%(host)r because it is not up\u0027,"},{"line_number":1721,"context_line":"                            {\u0027host\u0027: host})"},{"line_number":1722,"context_line":"                        skipped_host(target_ctxt, host, image_ids)"},{"line_number":1723,"context_line":"                        continue"},{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"                    fetch_pool.spawn_n(wrap_cache_images, target_ctxt, host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_2e090483","line":1722,"updated":"2019-10-29 18:01:55.000000000","message":"Do we need this now that we have down_hosts.add(host) above? I guess we do so we can update host_stats[\u0027completed\u0027] which is used by notify_about_aggregate_cache.","commit_id":"c9353775317cd76bd24f24589cdd51257040175f"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b4fda49cd236b92812af26e9cf2086cbbbaaf9eb","unresolved":false,"context_lines":[{"line_number":1719,"context_line":"                            \u0027Skipping image pre-cache request to compute \u0027"},{"line_number":1720,"context_line":"                            \u0027%(host)r because it is not up\u0027,"},{"line_number":1721,"context_line":"                            {\u0027host\u0027: host})"},{"line_number":1722,"context_line":"                        skipped_host(target_ctxt, host, image_ids)"},{"line_number":1723,"context_line":"                        continue"},{"line_number":1724,"context_line":""},{"line_number":1725,"context_line":"                    fetch_pool.spawn_n(wrap_cache_images, target_ctxt, host,"}],"source_content_type":"text/x-python","patch_set":6,"id":"3fa7e38b_0e8528ad","line":1722,"in_reply_to":"3fa7e38b_2e090483","updated":"2019-10-29 18:04:50.000000000","message":"Yeah, this fires the notification even for the skipped hosts. Otherwise we\u0027d have a gap for those hosts, which would mean we have N-1 notifications for a \"total\" of N. That\u0027s not a huge problem unless it\u0027s one of the last hosts, in which case if you do the simple thing of waiting for the N/N notification, it would never come.","commit_id":"c9353775317cd76bd24f24589cdd51257040175f"}],"nova/notifications/objects/aggregate.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6e920501b8bcdfd694e18fc7bbfaa861cb7f103a","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.populate_schema(aggregate\u003daggregate)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@base.notification_sample(\u0027aggregate-cache_images-progress.json\u0027)"},{"line_number":103,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":104,"context_line":"class AggregateCacheNotification(base.NotificationBase):"},{"line_number":105,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_e889cb25","line":102,"updated":"2019-10-25 16:45:51.000000000","message":"This doesn\u0027t exist under doc/notification_samples/.","commit_id":"73f75e231149d064f680ea20d06d23808f74d096"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c6b2a0be4be01d577ac165d043a3e3776d26d533","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.populate_schema(aggregate\u003daggregate)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@base.notification_sample(\u0027aggregate-cache_images-progress.json\u0027)"},{"line_number":103,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":104,"context_line":"class AggregateCacheNotification(base.NotificationBase):"},{"line_number":105,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_e38ecc25","line":102,"in_reply_to":"3fa7e38b_c8eacf72","updated":"2019-10-25 17:38:24.000000000","message":"You have to create it manually and then the functional notification samples tests validate the sample against the notification generated by the test like this:\n\nhttps://review.opendev.org/#/c/691129/1/nova/tests/functional/notification_sample_tests/test_aggregate.py@199\n\nSo rebase on my change and add something to that test.","commit_id":"73f75e231149d064f680ea20d06d23808f74d096"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"4c64a474c4efb0b94996bff2d22e8920a9252a93","unresolved":false,"context_lines":[{"line_number":99,"context_line":"        self.populate_schema(aggregate\u003daggregate)"},{"line_number":100,"context_line":""},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"@base.notification_sample(\u0027aggregate-cache_images-progress.json\u0027)"},{"line_number":103,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":104,"context_line":"class AggregateCacheNotification(base.NotificationBase):"},{"line_number":105,"context_line":"    # Version 1.0: Initial version"}],"source_content_type":"text/x-python","patch_set":1,"id":"3fa7e38b_c8eacf72","line":102,"in_reply_to":"3fa7e38b_e889cb25","updated":"2019-10-25 16:58:44.000000000","message":"Yeah, I was going to ask how to generate those.","commit_id":"73f75e231149d064f680ea20d06d23808f74d096"}],"nova/tests/functional/compute/test_cache_image.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"252783f35280308492124303da68105359249d04","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        fake_notifier.wait_for_versioned_notifications("},{"line_number":74,"context_line":"            \u0027aggregate.cache_images.start\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_f5a51004","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":65},"updated":"2019-10-28 12:02:12.000000000","message":"This only waits for the first notification. I think what you need here is:\n   fake_notifier.wait_for_versioned_notifications(\u0027aggregate.cache_images.progress\u0027, n_events\u003d4)","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23f0289cd4964ef8d7df642e23e61ba5f112593f","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        fake_notifier.wait_for_versioned_notifications("},{"line_number":74,"context_line":"            \u0027aggregate.cache_images.start\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_9b888dc6","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":65},"in_reply_to":"3fa7e38b_1bb81dc6","updated":"2019-10-28 14:49:27.000000000","message":"yes it is the \"at least\" part of the waiting that makes it working in the previous version.","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"b9e4cb518b28cbe57df95bcae6b4b41c83290df8","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        fake_notifier.wait_for_versioned_notifications("},{"line_number":74,"context_line":"            \u0027aggregate.cache_images.start\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_1bb81dc6","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":65},"in_reply_to":"3fa7e38b_dbd84553","updated":"2019-10-28 14:31:31.000000000","message":"So the docstring says \"waits for *at least* n notifications\" so I assume\" that since they all get generated immediately that this grabs them all. However, for future-proofing against a race, I\u0027ll add the count.","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":4393,"name":"Dan Smith","email":"dms@danplanet.com","username":"danms"},"change_message_id":"f5637080cde6fadc86fe0f7bde0fd7898c2fab91","unresolved":false,"context_lines":[{"line_number":73,"context_line":"        fake_notifier.wait_for_versioned_notifications("},{"line_number":74,"context_line":"            \u0027aggregate.cache_images.start\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3fa7e38b_dbd84553","line":76,"range":{"start_line":76,"start_character":33,"end_line":76,"end_character":65},"in_reply_to":"3fa7e38b_f5a51004","updated":"2019-10-28 14:26:36.000000000","message":"If that\u0027s true why is L77 working? While debugging I was definitely getting all the notifications I was expecting as I saw them dumped in the output.","commit_id":"b068798c477d67a49aba9da858dcdfd0233ebe5b"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"23f0289cd4964ef8d7df642e23e61ba5f112593f","unresolved":false,"context_lines":[{"line_number":74,"context_line":"            \u0027aggregate.cache_images.start\u0027)"},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027, n_events\u003d1)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"},{"line_number":80,"context_line":"            payload \u003d notification[\u0027payload\u0027][\u0027nova_object.data\u0027]"}],"source_content_type":"text/x-python","patch_set":4,"id":"3fa7e38b_fb6d0103","line":77,"range":{"start_line":77,"start_character":56,"end_line":77,"end_character":57},"updated":"2019-10-28 14:49:27.000000000","message":"I think you wanted to say 4 here","commit_id":"603e91e15e749ae07f570208eb6cf2a9d731764e"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":75,"context_line":""},{"line_number":76,"context_line":"        progress \u003d fake_notifier.wait_for_versioned_notifications("},{"line_number":77,"context_line":"            \u0027aggregate.cache_images.progress\u0027, n_events\u003d4)"},{"line_number":78,"context_line":"        self.assertEqual(4, len(progress))"},{"line_number":79,"context_line":"        for notification in progress:"},{"line_number":80,"context_line":"            payload \u003d notification[\u0027payload\u0027][\u0027nova_object.data\u0027]"},{"line_number":81,"context_line":"            if payload[\u0027host\u0027] \u003d\u003d \u0027compute5\u0027:"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_fc9ad410","line":78,"updated":"2019-10-28 20:16:04.000000000","message":"nit: do this like:\n\n  self.assertEqual(4, len(progress), progress)\n\nBecause if the length assertion fails at some point we want the actual list of notifications dumped into the logs for debug.","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7a9b569c757ee77d761b03914cf1ebc2c89504da","unresolved":false,"context_lines":[{"line_number":86,"context_line":"                self.assertEqual([], payload[\u0027images_failed\u0027])"},{"line_number":87,"context_line":"            self.assertLessEqual(payload[\u0027index\u0027], 4)"},{"line_number":88,"context_line":"            self.assertGreater(payload[\u0027index\u0027], 0)"},{"line_number":89,"context_line":"            self.assertEqual(payload[\u0027total\u0027], 4)"},{"line_number":90,"context_line":""},{"line_number":91,"context_line":"        fake_notifier.wait_for_versioned_notifications("},{"line_number":92,"context_line":"            \u0027aggregate.cache_images.end\u0027)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3fa7e38b_7c8ee4d1","line":89,"range":{"start_line":89,"start_character":29,"end_line":89,"end_character":48},"updated":"2019-10-28 20:16:04.000000000","message":"nit: swap the args (expected, actual)","commit_id":"7ac00ba93d37c66edc26e67c1b8996bc0a91434c"}]}
