)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"0e58541375d2d17aa0033a721f3a1809dfdb7ef2","unresolved":false,"context_lines":[{"line_number":11,"context_line":"project_id and not the keypair object"},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: I71e9d8dae55653ad3ee70f708a6d92c98ed20c1c"},{"line_number":14,"context_line":"Implements: bp versioned-notification-transformation-ocata"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":9,"id":"fa31d9ce_04a83c76","line":14,"updated":"2017-02-15 11:45:09.000000000","message":"if you have to respin the patch then please change this to versioned-notification-transformation-pike","commit_id":"e5b29e560a003b98d92948c1928df493a8905aeb"}],"nova/compute/api.py":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"2e18a66c66c721c239198ff9d493f9490dda0408","unresolved":false,"context_lines":[{"line_number":4450,"context_line":"        \"\"\"Create a new key pair.\"\"\""},{"line_number":4451,"context_line":"        self._validate_new_key_pair(context, user_id, key_name, key_type)"},{"line_number":4452,"context_line":""},{"line_number":4453,"context_line":"        self._notify(context, \u0027create.start\u0027, key_name)"},{"line_number":4454,"context_line":""},{"line_number":4455,"context_line":"        private_key, public_key, fingerprint \u003d self._generate_key_pair("},{"line_number":4456,"context_line":"            user_id, key_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_426e0502","line":4453,"updated":"2017-01-04 17:52:28.000000000","message":"I would really expect the start notification to be sent here.\n\nYes, the keypair will not be defined fully, you will only get the bits the user have specified, but thats to be expected.\n\nI only say that because the line 4455 could take some time on certain machines, and has bene known to fail.","commit_id":"0b0045db5b2030b87e16ec58620fc0f568b4e057"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"de990873ae7649c979d25d22d9046adea401c3c5","unresolved":false,"context_lines":[{"line_number":4450,"context_line":"        \"\"\"Create a new key pair.\"\"\""},{"line_number":4451,"context_line":"        self._validate_new_key_pair(context, user_id, key_name, key_type)"},{"line_number":4452,"context_line":""},{"line_number":4453,"context_line":"        self._notify(context, \u0027create.start\u0027, key_name)"},{"line_number":4454,"context_line":""},{"line_number":4455,"context_line":"        private_key, public_key, fingerprint \u003d self._generate_key_pair("},{"line_number":4456,"context_line":"            user_id, key_type)"}],"source_content_type":"text/x-python","patch_set":5,"id":"ba5201f7_a6a502a3","line":4453,"in_reply_to":"ba5201f7_426e0502","updated":"2017-01-04 18:46:09.000000000","message":"Done","commit_id":"0b0045db5b2030b87e16ec58620fc0f568b4e057"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c63b7d79e45f74769cb5c670401062133846c721","unresolved":false,"context_lines":[{"line_number":4462,"context_line":"        keypair.name \u003d key_name"},{"line_number":4463,"context_line":"        keypair.type \u003d key_type"},{"line_number":4464,"context_line":""},{"line_number":4465,"context_line":"        self._notify(context, \u0027create.start\u0027, key_name)"},{"line_number":4466,"context_line":"        compute_utils.notify_about_keypair_action("},{"line_number":4467,"context_line":"            context\u003dcontext,"},{"line_number":4468,"context_line":"            keypair\u003dkeypair,"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba5201f7_dc58008d","line":4465,"updated":"2017-01-05 09:41:46.000000000","message":"The problem with this is that the keypair object is not fully initialized at this point. As soon as the notification sending code tries to read the uninitialized fields (e.g. fingerprint) obj_load_attr is called and that will blow up as these fields are not lazy loaded. This patch does not fail the test currently only because we skip the non-set fields [1] in the notification payload population. However I\u0027m about to remove [1] as it hides problems like [2].\n\nI suggest to initialize the fields to None before _notify() to avoid this.\n\n\n\n[1] https://github.com/openstack/nova/blob/master/nova/notifications/objects/base.py#L97\n[2] https://bugs.launchpad.net/nova/+bug/1653221","commit_id":"5bd9151bd59dda9b84d4d8c6282c7e108632a37c"}],"nova/compute/utils.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"06d25f3671581f1b4bbe4f71bc617e51681bc951","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    notification \u003d keypair_notification.KeypairNotification("},{"line_number":403,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":404,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("},{"line_number":405,"context_line":"            context\u003dcontext, host\u003dCONF.host, binary\u003d\u0027nova-api\u0027),"},{"line_number":406,"context_line":"        event_type\u003dnotification_base.EventType("},{"line_number":407,"context_line":"            object\u003d\u0027keypair\u0027,"},{"line_number":408,"context_line":"            action\u003daction,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff0f0b1f_ce481cb4","line":405,"range":{"start_line":405,"start_character":53,"end_line":405,"end_character":61},"updated":"2017-05-25 02:05:43.000000000","message":"Is this correct? Have we used this anywhere else? I thought the binary was actually nova-osapi_compute?","commit_id":"120286a5d5fda613f886a33050c9b4851dbc1017"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fbf36b5a330d3a1b83cda8c1797ea341e90d115b","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    notification \u003d keypair_notification.KeypairNotification("},{"line_number":403,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":404,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("},{"line_number":405,"context_line":"            context\u003dcontext, host\u003dCONF.host, binary\u003d\u0027nova-api\u0027),"},{"line_number":406,"context_line":"        event_type\u003dnotification_base.EventType("},{"line_number":407,"context_line":"            object\u003d\u0027keypair\u0027,"},{"line_number":408,"context_line":"            action\u003daction,"}],"source_content_type":"text/x-python","patch_set":11,"id":"df140735_78f2e671","line":405,"range":{"start_line":405,"start_character":53,"end_line":405,"end_character":61},"in_reply_to":"ff0f0b1f_0e8614ba","updated":"2017-06-06 15:36:51.000000000","message":"It was a pattern already in the legacy notifications. I filed a bug https://bugs.launchpad.net/nova/+bug/1696152 to fix it both in legacy and in versioned.\nI suggest to let this patch in, and fix the bug in a separate patch.","commit_id":"120286a5d5fda613f886a33050c9b4851dbc1017"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"3bbf710eb3e98f437c8361af4d2909e5145ae23f","unresolved":false,"context_lines":[{"line_number":402,"context_line":"    notification \u003d keypair_notification.KeypairNotification("},{"line_number":403,"context_line":"        priority\u003dfields.NotificationPriority.INFO,"},{"line_number":404,"context_line":"        publisher\u003dnotification_base.NotificationPublisher("},{"line_number":405,"context_line":"            context\u003dcontext, host\u003dCONF.host, binary\u003d\u0027nova-api\u0027),"},{"line_number":406,"context_line":"        event_type\u003dnotification_base.EventType("},{"line_number":407,"context_line":"            object\u003d\u0027keypair\u0027,"},{"line_number":408,"context_line":"            action\u003daction,"}],"source_content_type":"text/x-python","patch_set":11,"id":"ff0f0b1f_0e8614ba","line":405,"range":{"start_line":405,"start_character":53,"end_line":405,"end_character":61},"in_reply_to":"ff0f0b1f_ce481cb4","updated":"2017-05-25 02:07:16.000000000","message":"Ugh, I see this is what we\u0027ve been using for flavor and aggregate notifications, so I guess we have a pattern already, even though it\u0027s maybe wrong? Gibi?","commit_id":"120286a5d5fda613f886a33050c9b4851dbc1017"}],"nova/notifications/objects/keypair.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5a01b510eafa397d490eeea8758a431acfaaebcc","unresolved":false,"context_lines":[{"line_number":19,"context_line":"class KeypairPayload(base.NotificationPayloadBase):"},{"line_number":20,"context_line":"    SCHEMA \u003d {"},{"line_number":21,"context_line":"        \u0027user_id\u0027: (\u0027keypair\u0027, \u0027user_id\u0027),"},{"line_number":22,"context_line":"        \u0027key_name\u0027: (\u0027keypair\u0027, \u0027name\u0027)"},{"line_number":23,"context_line":"    }"},{"line_number":24,"context_line":"    # Version 1.0: Initial version"},{"line_number":25,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":2,"id":"3a71b18c_d6473575","line":22,"updated":"2016-12-09 12:49:39.000000000","message":"I see that the legacy notification only contained the key_name but I feel that searchlight people will soon come and ask for other fields to be included to have similar data in the notification than what the REST API returns [1].\n\nI think it is fair to add public_key, fingerprint and type as well.\n\n[1]http://developer.openstack.org/api-ref/compute/#keypairs-keypairs","commit_id":"7cf561ef5ac0b98248552597df20b5ecd2cafa77"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"3255d9436ad752e78c22ee2fc6bba2fa741b0a43","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":29,"context_line":"    fields \u003d {"},{"line_number":30,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027fingerprint\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027public_key\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027type\u0027: fields.StringField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":3,"id":"3a71b18c_99ba10e0","line":31,"updated":"2016-12-12 10:43:22.000000000","message":"Is it really nullable? at least the keypair object definition makes it non nullable.","commit_id":"f9f68320c6101b254bde9f7e4375add203398e3c"},{"author":{"_account_id":20411,"name":"Julian","email":"julian.sy@att.com","username":"syjulian"},"change_message_id":"ebe3c56e29f4a83c3cf4eaf148e1c5e2bfd7c6ef","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":29,"context_line":"    fields \u003d {"},{"line_number":30,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":32,"context_line":"        \u0027fingerprint\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027public_key\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027type\u0027: fields.StringField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":3,"id":"1a6eadb0_e20bf87b","line":31,"in_reply_to":"3a71b18c_99ba10e0","updated":"2016-12-12 16:31:56.000000000","message":"Done","commit_id":"f9f68320c6101b254bde9f7e4375add203398e3c"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bdf3b11cd2ce404854ac0dff272f00f4f40633d4","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":29,"context_line":"    fields \u003d {"},{"line_number":30,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":31,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dFalse),"},{"line_number":32,"context_line":"        \u0027fingerprint\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027public_key\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027type\u0027: fields.StringField(nullable\u003dFalse),"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_025bb286","line":31,"range":{"start_line":31,"start_character":35,"end_line":31,"end_character":49},"updated":"2017-06-16 10:00:19.000000000","message":"you don\u0027t really need to be explicit here","commit_id":"ad56be6d225ef67892ecd29c0fff0b197c01c43a"},{"author":{"_account_id":7166,"name":"Sylvain Bauza","email":"sbauza@redhat.com","username":"sbauza"},"change_message_id":"bdf3b11cd2ce404854ac0dff272f00f4f40633d4","unresolved":false,"context_lines":[{"line_number":31,"context_line":"        \u0027name\u0027: fields.StringField(nullable\u003dFalse),"},{"line_number":32,"context_line":"        \u0027fingerprint\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":33,"context_line":"        \u0027public_key\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":34,"context_line":"        \u0027type\u0027: fields.StringField(nullable\u003dFalse),"},{"line_number":35,"context_line":"    }"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def __init__(self, keypair, **kwargs):"}],"source_content_type":"text/x-python","patch_set":15,"id":"7f231b9d_624946b5","line":34,"range":{"start_line":34,"start_character":16,"end_line":34,"end_character":35},"updated":"2017-06-16 10:00:19.000000000","message":"we could have constrainted more the field type, but given the main o.vo object is already using a StringField, meh.","commit_id":"ad56be6d225ef67892ecd29c0fff0b197c01c43a"}],"nova/tests/functional/notification_sample_tests/test_keypair.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"aaef745d3bf5b347b425d11e65656f31c19a7c38","unresolved":false,"context_lines":[{"line_number":31,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[0])"},{"line_number":32,"context_line":"        self._verify_notification("},{"line_number":33,"context_line":"            \u0027keypair-create-end\u0027,"},{"line_number":34,"context_line":"            replacements\u003d{"},{"line_number":35,"context_line":"                \"fingerprint\": keypair[\u0027fingerprint\u0027],"},{"line_number":36,"context_line":"                \"public_key\": keypair[\u0027public_key\u0027]"},{"line_number":37,"context_line":"            },"},{"line_number":38,"context_line":"            actual\u003dfake_notifier.VERSIONED_NOTIFICATIONS[1])"}],"source_content_type":"text/x-python","patch_set":9,"id":"5a3905b3_f0cdda31","line":37,"range":{"start_line":34,"start_character":1,"end_line":37,"end_character":14},"updated":"2017-01-23 08:53:41.000000000","message":"Anusha had a valid point in [1] that having a replacement here is not the best thing. I think we can avoid that if you create a keypair with a hard coded public_key (the REST API allows it).\n\n[1] https://review.openstack.org/#/c/419730/","commit_id":"e5b29e560a003b98d92948c1928df493a8905aeb"}]}
