)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"632cde5234b25f4476faad8c25d7c54f3695a3db","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2017-03-29 20:48:27 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add keypairs field to InstancePayload"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I30e068d4de4b45f34308665de37d4cb9d6502111"},{"line_number":10,"context_line":"Implements: bp additional-notification-fields-for-searchlight"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":16,"id":"ffe62b97_fc08292e","line":8,"updated":"2017-03-30 11:22:07.000000000","message":"say something more?","commit_id":"6c5b799f07e13619ad87d2637f39edd39c9f9056"}],"nova/notifications/objects/instance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"68d2704d592c4e21a59e7973be36631b3ba3046d","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_41e06bcd","line":223,"updated":"2017-01-18 08:52:03.000000000","message":"There is parallel work to define a KeypairPayload here https://review.openstack.org/#/c/408689/9/nova/notifications/objects/keypair.py for the keypair.create notification. I think you can reuse that.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"d21f00d1590b35abcbc42bb1cfacd31ef02e9ec0","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_a9165f49","line":223,"in_reply_to":"5a3905b3_5004ee48","updated":"2017-01-23 23:44:07.000000000","message":"Done.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"51cbf12172e34a58a0d1742c7875dc2a1bf3ccea","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_5004ee48","line":223,"in_reply_to":"5a3905b3_7a0adb22","updated":"2017-01-23 08:54:04.000000000","message":"I think it is more important to have one consistent KeypairPayload than having no replacements in the sample test. \n\nIt would be nice to have a stable public_key and fingerprint in the notification samples. I think you can do that if you import a hardcoded public key from the test setup and then use the name of that keypair in the instance boot.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"00e1e581f8ed186fc72f58150520e646e476cc05","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_7a0adb22","line":223,"in_reply_to":"5a3905b3_d5cbab51","updated":"2017-01-20 18:41:11.000000000","message":"I tried to have the same payload as in keypair.create, but the fields public_key and fingerprint will contain different values everytime. keypair.create patch uses replacements before comparing notifications https://review.openstack.org/#/c/408689/9/nova/tests/functional/notification_sample_tests/test_keypair.py\n\nSo in my case I have to use replacements of those fields in here \nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/notification_sample_tests/test_instance.py#L101\n\nI am not sure if it is good to add public_key and fingerprint in replacements. So I didn\u0027t add those two fields. Let me know your opinion on this.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"c143d017c7c885daa8df8b161e05d6490c3745af","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_632e2ba6","line":223,"in_reply_to":"7a3c09a3_41e06bcd","updated":"2017-01-18 17:20:40.000000000","message":"You are right. I have seen that patch but my problem is I am already depending on auto_config and tags patches, so I felt it is not good to put the Keypairs parallel patch in this series. I felt it would be easy to rebase my changes when the parallel patch gets merged. Its just separating the payload to different file and its not a big change. Let me know your thoughts on this.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"e44ead3400ebdf7e228e51e6e5f101b5622b08aa","unresolved":false,"context_lines":[{"line_number":220,"context_line":""},{"line_number":221,"context_line":""},{"line_number":222,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":223,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":224,"context_line":"    SCHEMA \u003d {"},{"line_number":225,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":226,"context_line":"        \u0027name\u0027: (\u0027keypair\u0027, \u0027name\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"5a3905b3_d5cbab51","line":223,"in_reply_to":"7a3c09a3_632e2ba6","updated":"2017-01-20 16:19:27.000000000","message":"Yeah, it is hard to tell which patch will go in first. Anyhow your payload has different amount of fields than the payload used in keypair.create so at least that should be in sync.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c03b18055bf3cb773b062cf29452b182385a49f6","unresolved":false,"context_lines":[{"line_number":111,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":112,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":113,"context_line":""},{"line_number":114,"context_line":"        keypairs \u003d []"},{"line_number":115,"context_line":"        for keypair in instance.keypairs.objects:"},{"line_number":116,"context_line":"            keypair_payload \u003d KeypairPayload(keypair\u003dkeypair)"},{"line_number":117,"context_line":"            keypairs.append(keypair_payload)"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":120,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":16,"id":"ffe62b97_285f6f73","line":117,"range":{"start_line":114,"start_character":0,"end_line":117,"end_character":44},"updated":"2017-03-30 09:23:49.000000000","message":"nit: can be written as a list comprehension:\nkeypairs \u003d [KeypairPayload(keypair\u003dkeypair) for keypair in instance.keypairs.objects]","commit_id":"6c5b799f07e13619ad87d2637f39edd39c9f9056"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c51c78ec26201729e04b0e28bd5d186fadac25c9","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        keypairs \u003d [KeypairPayload(keypair\u003dkeypair)"},{"line_number":109,"context_line":"                    for keypair in instance.keypairs.objects]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":112,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_07beb964","line":109,"range":{"start_line":109,"start_character":35,"end_line":109,"end_character":52},"updated":"2017-05-04 19:57:20.000000000","message":"How much lazy-loading is involved in getting the keypairs? Since this is part of every instance-related operation and notification it concerns me that we\u0027re going to be lazy-loading this all the time from the instance_extras table. This is similar to the concern I had with the instance.tags change, which we just added to the instance.update notification:\n\nhttps://review.openstack.org/#/c/407228/\n\nUnless there is a strong reason to be passing keypairs in every instance payload notification, I think we should just restrict this to instance.create/update/delete notifications, not the action ones. The unfortunate thing is instance.create/delete notificiations use the InstanceActionPayload, which means if we add it to those, it\u0027s going to leak into every other action notification. So would we need to create special payload types for instance create/delete?","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c51c78ec26201729e04b0e28bd5d186fadac25c9","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        keypairs \u003d [KeypairPayload(keypair\u003dkeypair)"},{"line_number":109,"context_line":"                    for keypair in instance.keypairs.objects]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":112,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_6700dd35","line":109,"range":{"start_line":109,"start_character":52,"end_line":109,"end_character":60},"updated":"2017-05-04 19:57:20.000000000","message":"You shouldn\u0027t need to access the internal objects list like this, nova list type objects can be iterated.","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"7f4662932a7350f583255eac0920935600e97e99","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        keypairs \u003d [KeypairPayload(keypair\u003dkeypair)"},{"line_number":109,"context_line":"                    for keypair in instance.keypairs.objects]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":112,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_8aa2d099","line":109,"range":{"start_line":109,"start_character":35,"end_line":109,"end_character":52},"in_reply_to":"3f044301_07beb964","updated":"2017-05-04 20:16:50.000000000","message":"Rather than put the full keypairs list in all instance action notifications, what if we put the instance.key_name in the InstancePayload since that\u0027s just part of the instances table and object, and then put the full keypair in the instance create/update/delete notifications?\n\nI\u0027m not even sure if we need to provide the full keypair in the instance update or delete notifications, since you can\u0027t update the keypair on an instance after it\u0027s created, but including it with instance.update could be consistent with including instance.tags.","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bfc35c8356379390e59294bd852a27b05f95398a","unresolved":false,"context_lines":[{"line_number":106,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"        keypairs \u003d [KeypairPayload(keypair\u003dkeypair)"},{"line_number":109,"context_line":"                    for keypair in instance.keypairs.objects]"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":112,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_a817bba3","line":109,"range":{"start_line":109,"start_character":35,"end_line":109,"end_character":52},"in_reply_to":"3f044301_8aa2d099","updated":"2017-05-05 17:17:00.000000000","message":"Done in two separate patches.","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6969010b4dd49911eba3a718de15cc71a6a5abb0","unresolved":false,"context_lines":[{"line_number":172,"context_line":""},{"line_number":173,"context_line":"    def __init__(self, instance, fault):"},{"line_number":174,"context_line":"        super(InstanceCreatePayload, self).__init__("},{"line_number":175,"context_line":"                instance\u003dinstance,"},{"line_number":176,"context_line":"                fault\u003dfault)"},{"line_number":177,"context_line":"        self.keypairs \u003d [keypair_payload.KeypairPayload(keypair\u003dkeypair)"},{"line_number":178,"context_line":"                         for keypair in instance.keypairs]"}],"source_content_type":"text/x-python","patch_set":35,"id":"3f1d235d_a62cc899","line":175,"updated":"2017-06-29 13:20:32.000000000","message":"not sure why the alignment need to change","commit_id":"f756964b2240217cada4bd7fec7be809a8542307"}],"nova/tests/functional/api/client.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e96da51b2bcd6f08f505522b4032556c7e219e5e","unresolved":false,"context_lines":[{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def post_keypair(self, keypair):"},{"line_number":428,"context_line":"        return self.api_post(\u0027/os-keypairs\u0027, keypair,"},{"line_number":429,"context_line":"                             check_response_status\u003d[201]).body[\u0027keypair\u0027]"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f201791_293f75d7","line":429,"range":{"start_line":429,"start_character":29,"end_line":429,"end_character":56},"updated":"2017-06-22 15:52:15.000000000","message":"This isn\u0027t entirely related, right? Not that I mind but might be worth dragging out if so","commit_id":"f0ee5ced0720b15fba4e5076e5ebe6aa5bff37ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9a7a8859fac4d2257d1953c85d292fad5324ff1b","unresolved":false,"context_lines":[{"line_number":426,"context_line":""},{"line_number":427,"context_line":"    def post_keypair(self, keypair):"},{"line_number":428,"context_line":"        return self.api_post(\u0027/os-keypairs\u0027, keypair,"},{"line_number":429,"context_line":"                             check_response_status\u003d[201]).body[\u0027keypair\u0027]"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f201791_c6d7ec4a","line":429,"range":{"start_line":429,"start_character":29,"end_line":429,"end_character":56},"in_reply_to":"5f201791_293f75d7","updated":"2017-06-28 09:03:06.000000000","message":"You are right this was a result of a wrong rebase. Removed.","commit_id":"f0ee5ced0720b15fba4e5076e5ebe6aa5bff37ed"}],"nova/tests/unit/compute/test_compute.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c51c78ec26201729e04b0e28bd5d186fadac25c9","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        inst.updated_at \u003d timeutils.utcnow()"},{"line_number":301,"context_line":"        inst.launched_at \u003d timeutils.utcnow()"},{"line_number":302,"context_line":"        inst.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":303,"context_line":"        inst.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":304,"context_line":"        inst.flavor \u003d flavor"},{"line_number":305,"context_line":"        inst.old_flavor \u003d None"},{"line_number":306,"context_line":"        inst.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_aa0d8c38","line":303,"range":{"start_line":303,"start_character":44,"end_line":303,"end_character":54},"updated":"2017-05-04 19:57:20.000000000","message":"This is unnecessary and redundant.","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bfc35c8356379390e59294bd852a27b05f95398a","unresolved":false,"context_lines":[{"line_number":300,"context_line":"        inst.updated_at \u003d timeutils.utcnow()"},{"line_number":301,"context_line":"        inst.launched_at \u003d timeutils.utcnow()"},{"line_number":302,"context_line":"        inst.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":303,"context_line":"        inst.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":304,"context_line":"        inst.flavor \u003d flavor"},{"line_number":305,"context_line":"        inst.old_flavor \u003d None"},{"line_number":306,"context_line":"        inst.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_e81ca3c2","line":303,"range":{"start_line":303,"start_character":44,"end_line":303,"end_character":54},"in_reply_to":"3f044301_aa0d8c38","updated":"2017-05-05 17:17:00.000000000","message":"Done","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6969010b4dd49911eba3a718de15cc71a6a5abb0","unresolved":false,"context_lines":[{"line_number":302,"context_line":"        inst.updated_at \u003d timeutils.utcnow()"},{"line_number":303,"context_line":"        inst.launched_at \u003d timeutils.utcnow()"},{"line_number":304,"context_line":"        inst.security_groups \u003d objects.SecurityGroupList(objects\u003d[])"},{"line_number":305,"context_line":"        inst.keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":306,"context_line":"        inst.flavor \u003d flavor"},{"line_number":307,"context_line":"        inst.old_flavor \u003d None"},{"line_number":308,"context_line":"        inst.new_flavor \u003d None"}],"source_content_type":"text/x-python","patch_set":35,"id":"3f1d235d_a69f28b3","line":305,"range":{"start_line":305,"start_character":44,"end_line":305,"end_character":54},"updated":"2017-06-29 13:20:32.000000000","message":"objects\u003d[] is redundant\n\nI\u0027m also not really sure why this is necessary in here - from what I\u0027m reading in the Instance object code, if we can\u0027t load keypairs on the instance it should just noop.","commit_id":"f756964b2240217cada4bd7fec7be809a8542307"}],"nova/tests/unit/compute/test_compute_utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"68d2704d592c4e21a59e7973be36631b3ba3046d","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self.assertItemsEqual([\u0027foo\u0027], tags[\u0027tags\u0027])"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":525,"context_line":"        self.assertEqual({\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027, \u0027type\u0027: \u0027ssh\u0027},"},{"line_number":526,"context_line":"                                                              keypair_data)"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_e1d957f4","line":524,"updated":"2017-01-18 08:52:03.000000000","message":"You could assert that only one keypair is in the keypairs payload. That would make the zero index in this line more understandable as well.","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"c143d017c7c885daa8df8b161e05d6490c3745af","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self.assertItemsEqual([\u0027foo\u0027], tags[\u0027tags\u0027])"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":525,"context_line":"        self.assertEqual({\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027, \u0027type\u0027: \u0027ssh\u0027},"},{"line_number":526,"context_line":"                                                              keypair_data)"},{"line_number":527,"context_line":""}],"source_content_type":"text/x-python","patch_set":5,"id":"7a3c09a3_230fc337","line":524,"in_reply_to":"7a3c09a3_e1d957f4","updated":"2017-01-18 17:20:40.000000000","message":"Done","commit_id":"ad95822b675bc4015e8914e01037dca1aebc7509"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"91e669303ddfeb22d123c5357018d043771f7a56","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self.assertItemsEqual([\u0027foo\u0027], tags[\u0027tags\u0027])"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":527,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027, \u0027display_description\u0027, \u0027locked\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_35e22fa0","line":524,"updated":"2017-01-20 16:23:16.000000000","message":"you removed the assertion of the content of the keypairs_payload but I think that was a good thing to have here.\nI think I left a confusing comment before. So what I\u0027d like to suggest is the following:\n    self.assertEqual(1, len(keypairs_payload))\n    keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]\n    self.assertEqual({\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027, \u0027type\u0027: \u0027ssh\u0027},keypair_data)","commit_id":"33960780b558f9a5c3cc50328641a3d1c86e444c"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"1f6553c21cfca34e863f0685f827c60752fae3c6","unresolved":false,"context_lines":[{"line_number":521,"context_line":"        self.assertItemsEqual([\u0027foo\u0027], tags[\u0027tags\u0027])"},{"line_number":522,"context_line":""},{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":""},{"line_number":526,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":527,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027, \u0027display_description\u0027, \u0027locked\u0027,"}],"source_content_type":"text/x-python","patch_set":6,"id":"5a3905b3_f76ee794","line":524,"in_reply_to":"5a3905b3_35e22fa0","updated":"2017-01-20 18:25:29.000000000","message":"Oh ya I misunderstood your comment previously. Will update it accordingly. Thanks.","commit_id":"33960780b558f9a5c3cc50328641a3d1c86e444c"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"07d6ef62ab333c474aa63b2898bec85743cd4ca5","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":526,"context_line":"        self.assertEqual({\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027, \u0027type\u0027: \u0027ssh\u0027},"},{"line_number":527,"context_line":"                                                              keypair_data)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_432a937f","line":526,"updated":"2017-01-20 22:20:45.000000000","message":"To improve readability, you can change the assert statement to compare each key:\n\n  self.assertEqual(keypair_data[\u0027name\u0027], \u0027my-key\u0027)\n  self.assertEqual(keypair_data[\u0027user_id\u0027], \u0027fake\u0027)\n  self.assertEqual(keypair_data[\u0027type\u0027], \u0027ssh2\u0027)","commit_id":"a4f842aa4cbc45f72845a05987eedbb5e65fe406"},{"author":{"_account_id":20217,"name":"Anusha Unnam","email":"anusha.unnam25@gmail.com","username":"aunnam"},"change_message_id":"9c7aabec2d51a9abc798014760688d3b0b2f4f66","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":526,"context_line":"        self.assertEqual({\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027, \u0027type\u0027: \u0027ssh\u0027},"},{"line_number":527,"context_line":"                                                              keypair_data)"},{"line_number":528,"context_line":""},{"line_number":529,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"}],"source_content_type":"text/x-python","patch_set":7,"id":"5a3905b3_c60aba25","line":526,"in_reply_to":"5a3905b3_432a937f","updated":"2017-01-23 23:43:34.000000000","message":"I am thinking this is more pythonic.","commit_id":"a4f842aa4cbc45f72845a05987eedbb5e65fe406"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c51c78ec26201729e04b0e28bd5d186fadac25c9","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":526,"context_line":"        self.assertEqual(keypair_data, {\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027,"},{"line_number":527,"context_line":"                               \u0027type\u0027: \u0027ssh\u0027, \u0027public_key\u0027: self.public_key,"},{"line_number":528,"context_line":"                               \u0027fingerprint\u0027: self.fingerprint})"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":531,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027, \u0027display_description\u0027, \u0027locked\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_8a3bf0cf","line":528,"range":{"start_line":526,"start_character":39,"end_line":528,"end_character":63},"updated":"2017-05-04 19:57:20.000000000","message":"nit: the dict key alignment could be better here.","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bfc35c8356379390e59294bd852a27b05f95398a","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":524,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":525,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":526,"context_line":"        self.assertEqual(keypair_data, {\u0027name\u0027: \u0027my-key\u0027, \u0027user_id\u0027: \u0027fake\u0027,"},{"line_number":527,"context_line":"                               \u0027type\u0027: \u0027ssh\u0027, \u0027public_key\u0027: self.public_key,"},{"line_number":528,"context_line":"                               \u0027fingerprint\u0027: self.fingerprint})"},{"line_number":529,"context_line":""},{"line_number":530,"context_line":"        for attr in (\u0027display_name\u0027, \u0027created_at\u0027, \u0027launched_at\u0027,"},{"line_number":531,"context_line":"                     \u0027state\u0027, \u0027task_state\u0027, \u0027display_description\u0027, \u0027locked\u0027,"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_c879e7fc","line":528,"range":{"start_line":526,"start_character":39,"end_line":528,"end_character":63},"in_reply_to":"3f044301_8a3bf0cf","updated":"2017-05-05 17:17:00.000000000","message":"Done","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"e96da51b2bcd6f08f505522b4032556c7e219e5e","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        self.assertEqual(payload[\u0027image_uuid\u0027], uuids.fake_image_ref)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test_notify_about_instance_create(self):"},{"line_number":526,"context_line":"        keypair \u003d objects.KeyPair(name\u003d\u0027my-key\u0027, user_id\u003d\u0027fake\u0027, type\u003d\u0027ssh\u0027,"},{"line_number":527,"context_line":"                                  public_key\u003dself.public_key,"},{"line_number":528,"context_line":"                                  fingerprint\u003dself.fingerprint)"},{"line_number":529,"context_line":"        keypairs \u003d objects.KeyPairList(objects\u003d[keypair])"},{"line_number":530,"context_line":"        instance \u003d create_instance(self.context, params\u003d{\u0027keypairs\u0027: keypairs})"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        compute_utils.notify_about_instance_create("},{"line_number":533,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f201791_c906c121","line":530,"range":{"start_line":526,"start_character":0,"end_line":530,"end_character":79},"updated":"2017-06-22 15:52:15.000000000","message":"nit: I wonder if we should have a test validating that this works correctly _without_ keypairs?","commit_id":"f0ee5ced0720b15fba4e5076e5ebe6aa5bff37ed"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9a7a8859fac4d2257d1953c85d292fad5324ff1b","unresolved":false,"context_lines":[{"line_number":523,"context_line":"        self.assertEqual(payload[\u0027image_uuid\u0027], uuids.fake_image_ref)"},{"line_number":524,"context_line":""},{"line_number":525,"context_line":"    def test_notify_about_instance_create(self):"},{"line_number":526,"context_line":"        keypair \u003d objects.KeyPair(name\u003d\u0027my-key\u0027, user_id\u003d\u0027fake\u0027, type\u003d\u0027ssh\u0027,"},{"line_number":527,"context_line":"                                  public_key\u003dself.public_key,"},{"line_number":528,"context_line":"                                  fingerprint\u003dself.fingerprint)"},{"line_number":529,"context_line":"        keypairs \u003d objects.KeyPairList(objects\u003d[keypair])"},{"line_number":530,"context_line":"        instance \u003d create_instance(self.context, params\u003d{\u0027keypairs\u0027: keypairs})"},{"line_number":531,"context_line":""},{"line_number":532,"context_line":"        compute_utils.notify_about_instance_create("},{"line_number":533,"context_line":"            self.context,"}],"source_content_type":"text/x-python","patch_set":33,"id":"5f201791_06c3a458","line":530,"range":{"start_line":526,"start_character":0,"end_line":530,"end_character":79},"in_reply_to":"5f201791_c906c121","updated":"2017-06-28 09:03:06.000000000","message":"It is easy to add and covers a real edge case so I added it.","commit_id":"f0ee5ced0720b15fba4e5076e5ebe6aa5bff37ed"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"6969010b4dd49911eba3a718de15cc71a6a5abb0","unresolved":false,"context_lines":[{"line_number":555,"context_line":"        keypairs_payload \u003d payload[\u0027keypairs\u0027]"},{"line_number":556,"context_line":"        self.assertEqual(1, len(keypairs_payload))"},{"line_number":557,"context_line":"        keypair_data \u003d keypairs_payload[0][\u0027nova_object.data\u0027]"},{"line_number":558,"context_line":"        self.assertEqual(keypair_data,"},{"line_number":559,"context_line":"                         {\u0027name\u0027: \u0027my-key\u0027,"},{"line_number":560,"context_line":"                          \u0027user_id\u0027: \u0027fake\u0027,"},{"line_number":561,"context_line":"                          \u0027type\u0027: \u0027ssh\u0027,"}],"source_content_type":"text/x-python","patch_set":35,"id":"3f1d235d_e6bbe00b","line":558,"updated":"2017-06-29 13:20:32.000000000","message":"nit: the args here should be reversed to be (expected, actual)","commit_id":"f756964b2240217cada4bd7fec7be809a8542307"}],"nova/tests/unit/notifications/objects/test_notification.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"c51c78ec26201729e04b0e28bd5d186fadac25c9","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        flavor \u003d objects.Flavor(flavorid\u003d\u0027test-flavor\u0027, name\u003d\u0027test-flavor\u0027,"},{"line_number":443,"context_line":"                                disabled\u003dFalse, projects\u003d[], is_public\u003dTrue,"},{"line_number":444,"context_line":"                                extra_specs\u003d{}, **self.flavor_values)"},{"line_number":445,"context_line":"        keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":446,"context_line":"        info_cache \u003d objects.InstanceInfoCache("},{"line_number":447,"context_line":"            network_info\u003dnetwork_model.NetworkInfo())"},{"line_number":448,"context_line":"        self.instance \u003d objects.Instance("}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_4a35e8d9","line":445,"range":{"start_line":445,"start_character":39,"end_line":445,"end_character":49},"updated":"2017-05-04 19:57:20.000000000","message":"redundant","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"bfc35c8356379390e59294bd852a27b05f95398a","unresolved":false,"context_lines":[{"line_number":442,"context_line":"        flavor \u003d objects.Flavor(flavorid\u003d\u0027test-flavor\u0027, name\u003d\u0027test-flavor\u0027,"},{"line_number":443,"context_line":"                                disabled\u003dFalse, projects\u003d[], is_public\u003dTrue,"},{"line_number":444,"context_line":"                                extra_specs\u003d{}, **self.flavor_values)"},{"line_number":445,"context_line":"        keypairs \u003d objects.KeyPairList(objects\u003d[])"},{"line_number":446,"context_line":"        info_cache \u003d objects.InstanceInfoCache("},{"line_number":447,"context_line":"            network_info\u003dnetwork_model.NetworkInfo())"},{"line_number":448,"context_line":"        self.instance \u003d objects.Instance("}],"source_content_type":"text/x-python","patch_set":25,"id":"3f044301_8883dfcc","line":445,"range":{"start_line":445,"start_character":39,"end_line":445,"end_character":49},"in_reply_to":"3f044301_4a35e8d9","updated":"2017-05-05 17:17:00.000000000","message":"Done","commit_id":"411282b8f608e2f62ca32ec3d46502387edbec95"}]}
