)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"46adb78cd74f869a7324a84e48d25aef366b581b","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This adds the notification base classes, documentation, and an example"},{"line_number":10,"context_line":"notification to Ironic."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Fixes-Bug: 1526408"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ib1b1fa819e8ff0b93afacd0b3de6e6762168e230"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"9a061dce_c64a4327","line":12,"updated":"2016-04-08 21:48:06.000000000","message":"Closes-Bug, I think, unless this is a synonym I haven\u0027t learned yet.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":9,"context_line":"This adds the notification base classes, documentation, and an example"},{"line_number":10,"context_line":"notification to Ironic."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Fixes-Bug: 1526408"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Ib1b1fa819e8ff0b93afacd0b3de6e6762168e230"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1a122d0e_7a13110e","line":12,"in_reply_to":"9a061dce_c64a4327","updated":"2016-04-21 23:16:11.000000000","message":"Fixed","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"}],"doc/source/dev/notifications.rst":[{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d3975c9e66b0ac72fc94ffb86659c9801763af87","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Versioned notifications in Ironic"},{"line_number":23,"context_line":"---------------------------------"},{"line_number":24,"context_line":"To make it easier for consumers of Ironic\u0027s notifications to use predictably,"},{"line_number":25,"context_line":"Ironic defines each notification and its payload as oslo versioned objects"},{"line_number":26,"context_line":"[2]_."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_4cd39e38","line":24,"updated":"2016-05-04 22:42:49.000000000","message":"nit: OpenStack docs style is Ironic in lowercase (multiple times throughout)\n\nhttp://docs.openstack.org/contributor-guide/writing-style/openstack-components.html","commit_id":"8195e5e09ab7b427cc85411808f5e3b8ea5878e7"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ce0ff4aa49cc7aaa6c12bad144ce4be3ea37f467","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":"Versioned notifications in Ironic"},{"line_number":23,"context_line":"---------------------------------"},{"line_number":24,"context_line":"To make it easier for consumers of Ironic\u0027s notifications to use predictably,"},{"line_number":25,"context_line":"Ironic defines each notification and its payload as oslo versioned objects"},{"line_number":26,"context_line":"[2]_."},{"line_number":27,"context_line":""}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_5f131a01","line":24,"in_reply_to":"1a122d0e_4cd39e38","updated":"2016-05-06 16:16:03.000000000","message":"Fixed","commit_id":"8195e5e09ab7b427cc85411808f5e3b8ea5878e7"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"d3975c9e66b0ac72fc94ffb86659c9801763af87","unresolved":false,"context_lines":[{"line_number":32,"context_line":"it did previously, indicating that a field was removed or the type of the"},{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option called \"notification_priority\" that"},{"line_number":36,"context_line":"indicates the minimum priority for which notifications will be"},{"line_number":37,"context_line":"emitted. The default is currently None, which indicates that no notifications"},{"line_number":38,"context_line":"will be sent by Ironic. Notification priorities may be \"debug\", \"info\", \"warn\","}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_accb5271","line":35,"updated":"2016-05-04 22:42:49.000000000","message":"What category is the option in?","commit_id":"8195e5e09ab7b427cc85411808f5e3b8ea5878e7"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ce0ff4aa49cc7aaa6c12bad144ce4be3ea37f467","unresolved":false,"context_lines":[{"line_number":32,"context_line":"it did previously, indicating that a field was removed or the type of the"},{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option called \"notification_priority\" that"},{"line_number":36,"context_line":"indicates the minimum priority for which notifications will be"},{"line_number":37,"context_line":"emitted. The default is currently None, which indicates that no notifications"},{"line_number":38,"context_line":"will be sent by Ironic. Notification priorities may be \"debug\", \"info\", \"warn\","}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_3a20ec48","line":35,"in_reply_to":"1a122d0e_accb5271","updated":"2016-05-06 16:16:03.000000000","message":"The default section, added that note here.","commit_id":"8195e5e09ab7b427cc85411808f5e3b8ea5878e7"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"61affd6f50af548a605f55de6bcd2c5dc7665694","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is currently None, which indicates"},{"line_number":38,"context_line":"that no notifications will be sent by ironic. Notification priorities may be"},{"line_number":39,"context_line":"\"debug\", \"info\", \"warn\", or \"error\", and each priority follows the OpenStack"},{"line_number":40,"context_line":"logging guidelines [3]_. If it\u0027s desired that ironic emit all notifications,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_fc80078d","line":37,"updated":"2016-05-11 13:24:02.000000000","message":"None is oslo config default. Better change like \"not defined by default, which indicates ...\"","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is currently None, which indicates"},{"line_number":38,"context_line":"that no notifications will be sent by ironic. Notification priorities may be"},{"line_number":39,"context_line":"\"debug\", \"info\", \"warn\", or \"error\", and each priority follows the OpenStack"},{"line_number":40,"context_line":"logging guidelines [3]_. If it\u0027s desired that ironic emit all notifications,"}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_1346994e","line":37,"in_reply_to":"dab17558_fc80078d","updated":"2016-05-11 13:49:08.000000000","message":"Done","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7b6667f69bb781c4e78c7d2358176a5f2812a1d6","unresolved":false,"context_lines":[{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is currently None, which indicates"},{"line_number":38,"context_line":"that no notifications will be sent by ironic. Notification priorities may be"},{"line_number":39,"context_line":"\"debug\", \"info\", \"warn\", or \"error\", and each priority follows the OpenStack"},{"line_number":40,"context_line":"logging guidelines [3]_. If it\u0027s desired that ironic emit all notifications,"},{"line_number":41,"context_line":"the config option should be set to \"debug\", for example. If only \"warn\" and"},{"line_number":42,"context_line":"\"error\" notifications are needed, the config option should be set to \"warn\"."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_50c2d7e9","line":39,"updated":"2016-05-11 13:34:59.000000000","message":"\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027audit\u0027, \u0027error\u0027, \u0027critical\u0027","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is currently None, which indicates"},{"line_number":38,"context_line":"that no notifications will be sent by ironic. Notification priorities may be"},{"line_number":39,"context_line":"\"debug\", \"info\", \"warn\", or \"error\", and each priority follows the OpenStack"},{"line_number":40,"context_line":"logging guidelines [3]_. If it\u0027s desired that ironic emit all notifications,"},{"line_number":41,"context_line":"the config option should be set to \"debug\", for example. If only \"warn\" and"},{"line_number":42,"context_line":"\"error\" notifications are needed, the config option should be set to \"warn\"."}],"source_content_type":"text/x-rst","patch_set":8,"id":"dab17558_d349b132","line":39,"in_reply_to":"dab17558_50c2d7e9","updated":"2016-05-11 13:49:08.000000000","message":"Done. I changed the ordering to the order the OpenStack logging guidelines shows.","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":20522,"name":"Aline Bousquet","email":"albousque@gmail.com","username":"alineb"},"change_message_id":"7154018f5edaab33ffc65c42ed5af1892a503eda","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification priorities"},{"line_number":39,"context_line":"may be \"debug\", \"info\", \"audit\", \"warning\", \"error\", or \"critical\", and each"},{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_1c38c5ee","line":37,"range":{"start_line":37,"start_character":31,"end_line":37,"end_character":68},"updated":"2016-06-23 14:45:45.000000000","message":"nit: s/The default/This option/ ?","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"687c6414276b7c8be0d60641e70d7558de30bbe9","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_priority\" that indicates the minimum priority for which"},{"line_number":37,"context_line":"notifications will be emitted. The default is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification priorities"},{"line_number":39,"context_line":"may be \"debug\", \"info\", \"audit\", \"warning\", \"error\", or \"critical\", and each"},{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"}],"source_content_type":"text/x-rst","patch_set":12,"id":"3aaa91ec_db750a33","line":37,"range":{"start_line":37,"start_character":31,"end_line":37,"end_character":68},"in_reply_to":"3aaa91ec_1c38c5ee","updated":"2016-06-27 19:03:59.000000000","message":"Fixed","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":39,"context_line":"may be \"debug\", \"info\", \"audit\", \"warning\", \"error\", or \"critical\", and each"},{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"},{"line_number":41,"context_line":"ironic emit all notifications, the config option should be set to \"debug\", for"},{"line_number":42,"context_line":"example. If only \"warn\", \"error\", and \"critical\" notifications are needed, the"},{"line_number":43,"context_line":"config option should be set to \"warn\"."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Ironic also has a set of base classes that assist in clearly defining the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3aaa91ec_baaa63d0","line":42,"updated":"2016-06-29 07:06:53.000000000","message":"s/warn/warning/","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":39,"context_line":"may be \"debug\", \"info\", \"audit\", \"warning\", \"error\", or \"critical\", and each"},{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"},{"line_number":41,"context_line":"ironic emit all notifications, the config option should be set to \"debug\", for"},{"line_number":42,"context_line":"example. If only \"warn\", \"error\", and \"critical\" notifications are needed, the"},{"line_number":43,"context_line":"config option should be set to \"warn\"."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Ironic also has a set of base classes that assist in clearly defining the"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3aaa91ec_996b1cb9","line":42,"in_reply_to":"3aaa91ec_baaa63d0","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"},{"line_number":41,"context_line":"ironic emit all notifications, the config option should be set to \"debug\", for"},{"line_number":42,"context_line":"example. If only \"warn\", \"error\", and \"critical\" notifications are needed, the"},{"line_number":43,"context_line":"config option should be set to \"warn\"."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Ironic also has a set of base classes that assist in clearly defining the"},{"line_number":46,"context_line":"notification itself, the payload, and the other fields not auto-generated by"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3aaa91ec_1aba9723","line":43,"updated":"2016-06-29 07:06:53.000000000","message":"ditto","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":40,"context_line":"priority follows the OpenStack logging guidelines [3]_. If it\u0027s desired that"},{"line_number":41,"context_line":"ironic emit all notifications, the config option should be set to \"debug\", for"},{"line_number":42,"context_line":"example. If only \"warn\", \"error\", and \"critical\" notifications are needed, the"},{"line_number":43,"context_line":"config option should be set to \"warn\"."},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"Ironic also has a set of base classes that assist in clearly defining the"},{"line_number":46,"context_line":"notification itself, the payload, and the other fields not auto-generated by"}],"source_content_type":"text/x-rst","patch_set":14,"id":"3aaa91ec_7970f0a4","line":43,"in_reply_to":"3aaa91ec_1aba9723","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"868081602b60181ff330138176d0dcb40057c5fa","unresolved":false,"context_lines":[{"line_number":137,"context_line":"           }"},{"line_number":138,"context_line":"       },"},{"line_number":139,"context_line":"       \"event_type\":\"baremetal.example_obj.do_something.start\","},{"line_number":140,"context_line":"       \"publisher_id\":\"conductor:cond-hostname01\""},{"line_number":141,"context_line":"    }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. [1] http://docs.openstack.org/developer/oslo.messaging/notifier.html"}],"source_content_type":"text/x-rst","patch_set":18,"id":"dada55a8_9e23bbbc","line":140,"updated":"2016-07-21 13:28:43.000000000","message":"Following the spec and code dot used as separator \u0027publisher_id\u0027: \u0027conductor.cond-hostname01\u0027","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"cf9667f366e90df75f8eeb05da1a1ed927c83df1","unresolved":false,"context_lines":[{"line_number":137,"context_line":"           }"},{"line_number":138,"context_line":"       },"},{"line_number":139,"context_line":"       \"event_type\":\"baremetal.example_obj.do_something.start\","},{"line_number":140,"context_line":"       \"publisher_id\":\"conductor:cond-hostname01\""},{"line_number":141,"context_line":"    }"},{"line_number":142,"context_line":""},{"line_number":143,"context_line":".. [1] http://docs.openstack.org/developer/oslo.messaging/notifier.html"}],"source_content_type":"text/x-rst","patch_set":18,"id":"dada55a8_0876233e","line":140,"in_reply_to":"dada55a8_9e23bbbc","updated":"2016-07-22 18:12:05.000000000","message":"Done","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"0c3c7a584dd60c717e8b955652598664ce366e09","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # an_extra_field is optional since it\u0027s not a part of the SCHEMA and is a"},{"line_number":108,"context_line":"    # nullable field in the class fields"},{"line_number":109,"context_line":"    my_notif_payload \u003d ExampleNotifPayload(an_extra_field\u003d\u0027hello\u0027)"},{"line_number":110,"context_line":"    # populate the schema with the ExampleObject fields"},{"line_number":111,"context_line":"    my_notif_payload.populate_schema(example_obj\u003dmy_example_obj)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"bacf61ea_e3edc98f","line":109,"updated":"2016-07-27 17:40:36.000000000","message":"not sure why you abbreviated \u0027notify\u0027 but it would be easier to read if it was my_notify_payload, ExampleNotifyPayload, etc.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":"    # an_extra_field is optional since it\u0027s not a part of the SCHEMA and is a"},{"line_number":108,"context_line":"    # nullable field in the class fields"},{"line_number":109,"context_line":"    my_notif_payload \u003d ExampleNotifPayload(an_extra_field\u003d\u0027hello\u0027)"},{"line_number":110,"context_line":"    # populate the schema with the ExampleObject fields"},{"line_number":111,"context_line":"    my_notif_payload.populate_schema(example_obj\u003dmy_example_obj)"},{"line_number":112,"context_line":""}],"source_content_type":"text/x-rst","patch_set":20,"id":"bacf61ea_d43032a1","line":109,"in_reply_to":"bacf61ea_e3edc98f","updated":"2016-07-27 22:25:38.000000000","message":"Done","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c60fd52c42dcd6079215e136c8b97ef2f3e1e7ca","unresolved":false,"context_lines":[{"line_number":32,"context_line":"it did previously, indicating that a field was removed or the type of the"},{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_level\" that indicates the minimum level for which"},{"line_number":37,"context_line":"notifications will be emitted. This option is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification levels"}],"source_content_type":"text/x-rst","patch_set":25,"id":"1ac06dbe_32a7d250","line":35,"range":{"start_line":35,"start_character":45,"end_line":35,"end_character":52},"updated":"2016-08-22 10:56:29.000000000","message":"s/default/``DEFAULT``","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"it did previously, indicating that a field was removed or the type of the"},{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_level\" that indicates the minimum level for which"},{"line_number":37,"context_line":"notifications will be emitted. This option is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification levels"}],"source_content_type":"text/x-rst","patch_set":25,"id":"1ac06dbe_1baf3d82","line":35,"range":{"start_line":35,"start_character":45,"end_line":35,"end_character":52},"in_reply_to":"1ac06dbe_32a7d250","updated":"2016-08-22 16:07:07.000000000","message":"Done","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c60fd52c42dcd6079215e136c8b97ef2f3e1e7ca","unresolved":false,"context_lines":[{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_level\" that indicates the minimum level for which"},{"line_number":37,"context_line":"notifications will be emitted. This option is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification levels"},{"line_number":39,"context_line":"may be \"debug\", \"info\", \"warning\", \"error\", or \"critical\", and each"}],"source_content_type":"text/x-rst","patch_set":25,"id":"1ac06dbe_92bde66a","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":20},"updated":"2016-08-22 10:56:29.000000000","message":"s/\"notification_level\"/``notification_level``","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":33,"context_line":"payload field changed."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Ironic exposes a configuration option in the default section called"},{"line_number":36,"context_line":"\"notification_level\" that indicates the minimum level for which"},{"line_number":37,"context_line":"notifications will be emitted. This option is not defined by default, which"},{"line_number":38,"context_line":"indicates that no notifications will be sent by ironic. Notification levels"},{"line_number":39,"context_line":"may be \"debug\", \"info\", \"warning\", \"error\", or \"critical\", and each"}],"source_content_type":"text/x-rst","patch_set":25,"id":"1ac06dbe_5bb7f5d7","line":36,"range":{"start_line":36,"start_character":0,"end_line":36,"end_character":20},"in_reply_to":"1ac06dbe_92bde66a","updated":"2016-08-22 16:07:07.000000000","message":"Done","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"}],"etc/ironic/ironic.conf.sample":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"#socket_timeout \u003d 10000"},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":""},{"line_number":1515,"context_line":"[metrics]"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"#"},{"line_number":1518,"context_line":"# From ironic_lib.metrics"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"bacf61ea_fde60be7","side":"PARENT","line":1515,"updated":"2016-07-27 17:10:57.000000000","message":"what happened to the metrics configs?","commit_id":"79439274bb019b78da9e7c83e342618814787420"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":1512,"context_line":"#socket_timeout \u003d 10000"},{"line_number":1513,"context_line":""},{"line_number":1514,"context_line":""},{"line_number":1515,"context_line":"[metrics]"},{"line_number":1516,"context_line":""},{"line_number":1517,"context_line":"#"},{"line_number":1518,"context_line":"# From ironic_lib.metrics"}],"source_content_type":"application/octet-stream","patch_set":20,"id":"bacf61ea_14b5aacc","side":"PARENT","line":1515,"in_reply_to":"bacf61ea_fde60be7","updated":"2016-07-27 22:25:38.000000000","message":"Good catch. I\u0027m not sure, they got dropped at some point when I was rebasing and regenerating the config. They\u0027re back now after I regenerated it again.","commit_id":"79439274bb019b78da9e7c83e342618814787420"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dad92c93c129dc7e3aa0f3fb5ca91ec32fb5ca32","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"# The pool size limit for connections expiration policy"},{"line_number":251,"context_line":"# (integer value)"},{"line_number":252,"context_line":"#conn_pool_min_size \u003d 2"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"# The time-to-live in sec of idle connections in the pool"},{"line_number":255,"context_line":"# (integer value)"}],"source_content_type":"application/octet-stream","patch_set":25,"id":"1ac06dbe_890939e0","side":"PARENT","line":252,"updated":"2016-08-22 11:48:17.000000000","message":"Your venv needs to be updated, these options should be here.","commit_id":"e0dbcf4ae70654af54fc51660c14dc4a8ae3342c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":249,"context_line":""},{"line_number":250,"context_line":"# The pool size limit for connections expiration policy"},{"line_number":251,"context_line":"# (integer value)"},{"line_number":252,"context_line":"#conn_pool_min_size \u003d 2"},{"line_number":253,"context_line":""},{"line_number":254,"context_line":"# The time-to-live in sec of idle connections in the pool"},{"line_number":255,"context_line":"# (integer value)"}],"source_content_type":"application/octet-stream","patch_set":25,"id":"1ac06dbe_fb686189","side":"PARENT","line":252,"in_reply_to":"1ac06dbe_890939e0","updated":"2016-08-22 16:07:07.000000000","message":"Done","commit_id":"e0dbcf4ae70654af54fc51660c14dc4a8ae3342c"}],"ironic/common/exception.py":[{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":600,"context_line":""},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"class NotificationSchemaError(IronicException):"},{"line_number":603,"context_line":"    _msg_fmt \u003d _(\"Object %(obj)s doesn\u0027t have the field %(field)s \""},{"line_number":604,"context_line":"                 \"required for populating a notification schema\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_fd344b4b","line":603,"updated":"2016-07-27 17:10:57.000000000","message":"we don\u0027t tend to do this, but I like putting quotes around \"%(field)s\"","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":600,"context_line":""},{"line_number":601,"context_line":""},{"line_number":602,"context_line":"class NotificationSchemaError(IronicException):"},{"line_number":603,"context_line":"    _msg_fmt \u003d _(\"Object %(obj)s doesn\u0027t have the field %(field)s \""},{"line_number":604,"context_line":"                 \"required for populating a notification schema\")"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_94d87a1f","line":603,"in_reply_to":"bacf61ea_fd344b4b","updated":"2016-07-27 22:25:38.000000000","message":"+1, done","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"}],"ironic/common/rpc.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":27,"context_line":"               choices\u003dlist("},{"line_number":28,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":29,"context_line":"               default\u003dNone,"},{"line_number":30,"context_line":"               help\u003d\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                    \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                    \u0027notifications will be sent.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_dab9a17b","line":29,"updated":"2016-04-08 08:59:47.000000000","message":"nit: this line is not needed, None is default.","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":27,"context_line":"               choices\u003dlist("},{"line_number":28,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":29,"context_line":"               default\u003dNone,"},{"line_number":30,"context_line":"               help\u003d\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                    \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                    \u0027notifications will be sent.\u0027)"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_2bedc825","line":29,"in_reply_to":"9a061dce_dab9a17b","updated":"2016-04-08 20:56:55.000000000","message":"Fixed","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":27,"context_line":"               choices\u003dlist("},{"line_number":28,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":29,"context_line":"               default\u003dNone,"},{"line_number":30,"context_line":"               help\u003d\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                    \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                    \u0027notifications will be sent.\u0027)"},{"line_number":33,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_7a80558c","line":30,"updated":"2016-04-08 08:59:47.000000000","message":"Help string should be translated with _().","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":27,"context_line":"               choices\u003dlist("},{"line_number":28,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":29,"context_line":"               default\u003dNone,"},{"line_number":30,"context_line":"               help\u003d\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                    \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                    \u0027notifications will be sent.\u0027)"},{"line_number":33,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_cbdc0c77","line":30,"in_reply_to":"9a061dce_7a80558c","updated":"2016-04-08 20:56:55.000000000","message":"Done","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c48f8b9471fca254dee8ead0970424fcd4cb48bb","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TRANSPORT \u003d None"},{"line_number":37,"context_line":"NOTIFICATION_TRANSPORT \u003d None"},{"line_number":38,"context_line":"VERSIONED_NOTIFICATION_TRANSPORT \u003d None"},{"line_number":39,"context_line":"METRICS_NOTIFIER \u003d None"},{"line_number":40,"context_line":"VERSIONED_NOTIFIER \u003d None"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_9a087bdb","line":38,"updated":"2016-04-14 09:13:42.000000000","message":"What is this one used for?","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"TRANSPORT \u003d None"},{"line_number":37,"context_line":"NOTIFICATION_TRANSPORT \u003d None"},{"line_number":38,"context_line":"VERSIONED_NOTIFICATION_TRANSPORT \u003d None"},{"line_number":39,"context_line":"METRICS_NOTIFIER \u003d None"},{"line_number":40,"context_line":"VERSIONED_NOTIFIER \u003d None"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_1a3f87d7","line":38,"in_reply_to":"5a18252c_9a087bdb","updated":"2016-04-21 23:16:11.000000000","message":"Good catch, it\u0027s not used. Added that when separating out notification transport from existing transport and forgot to remove it.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"ce0ff4aa49cc7aaa6c12bad144ce4be3ea37f467","unresolved":false,"context_lines":[{"line_number":78,"context_line":"        # necessary."},{"line_number":79,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":80,"context_line":"                                                serializer\u003dserializer,"},{"line_number":81,"context_line":"                                                topic\u003d\u0027notification\u0027)"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":""},{"line_number":84,"context_line":"def cleanup():"}],"source_content_type":"text/x-python","patch_set":7,"id":"1a122d0e_fa7e74e1","line":81,"updated":"2016-05-06 16:16:03.000000000","message":"Changed this as it was too similar to the default rpc topic in the config (\"notifications\")","commit_id":"8195e5e09ab7b427cc85411808f5e3b8ea5878e7"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c00e06792ff94c4efef6a4089715960bbd885923","unresolved":false,"context_lines":[{"line_number":26,"context_line":"notification_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_62b91f2e","line":29,"range":{"start_line":29,"start_character":59,"end_line":29,"end_character":71},"updated":"2016-05-11 08:46:30.000000000","message":"from your code \"if CONF.notification_priority is None:\" and per my understand, None is not need to append here. The Config value would be None if you didn\u0027t assign any value.","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"61affd6f50af548a605f55de6bcd2c5dc7665694","unresolved":false,"context_lines":[{"line_number":26,"context_line":"notification_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_fc05a713","line":29,"range":{"start_line":29,"start_character":59,"end_line":29,"end_character":71},"in_reply_to":"dab17558_62b91f2e","updated":"2016-05-11 13:24:02.000000000","message":"+1","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":26,"context_line":"notification_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_732f253f","line":29,"range":{"start_line":29,"start_character":59,"end_line":29,"end_character":71},"in_reply_to":"dab17558_fc05a713","updated":"2016-05-11 13:49:08.000000000","message":"Thanks, removed.","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"61affd6f50af548a605f55de6bcd2c5dc7665694","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":"CONF.register_opts(notification_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_5c14b34b","line":31,"updated":"2016-05-11 13:24:02.000000000","message":"Better \"... If not defined no notifications will be sent.\"","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":"CONF.register_opts(notification_opts)"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_53c02150","line":31,"in_reply_to":"dab17558_5c14b34b","updated":"2016-05-11 13:49:08.000000000","message":"Done","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"70ece0804dbee629651b6b8d99e88bf5dfe3caab","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":"CONF.register_opts(notification_opts)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_623da48e","line":32,"updated":"2016-05-11 06:08:37.000000000","message":"What is the default value for this variable?","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL).append(None),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. A value of \"None\" indicates that no \u0027"},{"line_number":32,"context_line":"                      \u0027notifications will be sent.\u0027))"},{"line_number":33,"context_line":"]"},{"line_number":34,"context_line":"CONF.register_opts(notification_opts)"},{"line_number":35,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_73a445b9","line":32,"in_reply_to":"dab17558_623da48e","updated":"2016-05-11 13:49:08.000000000","message":"undefined. Added a comment about it.","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"2c1dfb05961abaca7b3e8b1147f6ef47cb52d140","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"},{"line_number":33,"context_line":"                      \u0027undefined.\u0027))"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":"CONF.register_opts(notification_opts)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"TRANSPORT \u003d None"},{"line_number":38,"context_line":"NOTIFICATION_TRANSPORT \u003d None"}],"source_content_type":"text/x-python","patch_set":11,"id":"7aa08908_3177d13c","line":35,"updated":"2016-06-10 16:51:05.000000000","message":"Is this still the correct way to register a new option?\n\ntox -egenconfig doesn\u0027t seem to add it to the sample config","commit_id":"86226d550e562272fd9cb45d582d73cf3bf271cd"},{"author":{"_account_id":20522,"name":"Aline Bousquet","email":"albousque@gmail.com","username":"alineb"},"change_message_id":"7154018f5edaab33ffc65c42ed5af1892a503eda","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":167,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":168,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_ab216c4f","line":168,"updated":"2016-06-23 14:45:45.000000000","message":"Shouldn\u0027t \"publisher_id\" be checked for a None value (as in get_metrics_notifier)?","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"687c6414276b7c8be0d60641e70d7558de30bbe9","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":167,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":168,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_fbb9e6cc","line":168,"in_reply_to":"3aaa91ec_ab216c4f","updated":"2016-06-27 19:03:59.000000000","message":"Yes, good catch. I added an extra assert here since every notification should be sending a publisher ID.","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                                    serializer\u003dserializer)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def get_metrics_notifier(service\u003dNone, host\u003dNone, publisher_id\u003dNone):"},{"line_number":160,"context_line":"    assert METRICS_NOTIFIER is not None"},{"line_number":161,"context_line":"    if not publisher_id:"},{"line_number":162,"context_line":"        publisher_id \u003d \"%s.%s\" % (service, host or CONF.host)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_fa8b4b66","line":159,"updated":"2016-06-29 07:06:53.000000000","message":"lets maybe call it \"sensors_notifier\" or something like that. there is an ongoing work to introduce metrics in ironic, and this change will bring great confusion","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                                    serializer\u003dserializer)"},{"line_number":157,"context_line":""},{"line_number":158,"context_line":""},{"line_number":159,"context_line":"def get_metrics_notifier(service\u003dNone, host\u003dNone, publisher_id\u003dNone):"},{"line_number":160,"context_line":"    assert METRICS_NOTIFIER is not None"},{"line_number":161,"context_line":"    if not publisher_id:"},{"line_number":162,"context_line":"        publisher_id \u003d \"%s.%s\" % (service, host or CONF.host)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_f966a0b9","line":159,"in_reply_to":"3aaa91ec_fa8b4b66","updated":"2016-06-29 18:41:19.000000000","message":"Done, great point.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":167,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":168,"context_line":"    assert publisher_id is not None"},{"line_number":169,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_5ae9bf19","line":168,"updated":"2016-06-29 07:06:53.000000000","message":"this assumes that get_metrics_notifier is always called first, I\u0027d not rely on it","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":165,"context_line":""},{"line_number":166,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":167,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":168,"context_line":"    assert publisher_id is not None"},{"line_number":169,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_593894a0","line":168,"in_reply_to":"3aaa91ec_5ae9bf19","updated":"2016-06-29 18:41:19.000000000","message":"I\u0027m not sure I understand. The publisher_id here is a different local variable than the one in get_metrics_notifier. It should always be specified when sending a notification.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"a50d83cd1bbfac1cc7ed227166b9095821d1ec48","unresolved":false,"context_lines":[{"line_number":26,"context_line":"notification_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"},{"line_number":32,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_e9c14ce5","line":29,"updated":"2016-07-21 18:21:38.000000000","message":"How does this work? You provide choices as a list, but that list doesn\u0027t contain a None, is it implied?","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"cf9667f366e90df75f8eeb05da1a1ed927c83df1","unresolved":false,"context_lines":[{"line_number":26,"context_line":"notification_opts \u003d ["},{"line_number":27,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":28,"context_line":"               choices\u003dlist("},{"line_number":29,"context_line":"                   ironic_fields.NotificationPriority.ALL),"},{"line_number":30,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":31,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"},{"line_number":32,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_05060e20","line":29,"in_reply_to":"dada55a8_e9c14ce5","updated":"2016-07-22 18:12:05.000000000","message":"That\u0027s a really good question....\n\nFrom looking at some oslo code and docs, None is returned as the default as long as the option isn\u0027t defined and isn\u0027t required. The implicit default is for it to be undefined and not required here, so None will be implied. I validated this in one of the notification object test cases by making sure no notifications are emitted if we don\u0027t set the option in the config. I\u0027ll point that test out in a separate comment.\n\nI added a separate comment here to clarify the default behavior.\n\nHowever, if you un-comment an option and specify the *strings* \"\u003cNone\u003e\" or \"None\" as the value, you should get a ConfigFileValueError since those strings are not choices. \n\nI looked at the Opt base class docs here: http://docs.openstack.org/developer/oslo.config/opts.html#oslo_config.cfg.Opt\n\nand the param \"default\" defaults to None and \"required\" defaults to False, but the default of returning None for the value even if it\u0027s not listed as a choice isn\u0027t that well-documented.\n\nWhen you get a config option, it looks like the call eventually ends up here: https://github.com/openstack/oslo.config/blob/master/oslo_config/cfg.py#L2635\n\nand returns None if the default is None, which it is in this case: https://github.com/openstack/oslo.config/blob/master/oslo_config/cfg.py#L2688\n\nIf the option is defined, I believe it will end up here, and try to convert the config value to the appropriate type: https://github.com/openstack/oslo.config/blob/master/oslo_config/cfg.py#L2668\n\nI wasn\u0027t sure where \"namespace\" or \"self._namespace\" ends up being defined in that call, but that seems to be the intent in the normal case where you have a config option that you\u0027ve set.\n\nThat conversion will end up validating the string against the listed choices, which will fail for the string \"None\" and raise a ValueError: https://github.com/openstack/oslo.config/blob/master/oslo_config/types.py#L145\n\nThat gets caught by the caller and re-raised as a ConfigFileValueError.","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":10342,"name":"Jay Faulkner","display_name":"JayF","email":"jay@jvf.cc","username":"JayF","status":"youtube.com/@oss-gr / podcast.gr-oss.io"},"change_message_id":"a50d83cd1bbfac1cc7ed227166b9095821d1ec48","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"},{"line_number":33,"context_line":"                      \u0027undefined.\u0027))"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":"CONF.register_opts(notification_opts)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"TRANSPORT \u003d None"},{"line_number":38,"context_line":"NOTIFICATION_TRANSPORT \u003d None"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_c9a9e825","line":35,"updated":"2016-07-21 18:21:38.000000000","message":"Should these options be registered under a group, rather than [default]?","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"cf9667f366e90df75f8eeb05da1a1ed927c83df1","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"},{"line_number":33,"context_line":"                      \u0027undefined.\u0027))"},{"line_number":34,"context_line":"]"},{"line_number":35,"context_line":"CONF.register_opts(notification_opts)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"TRANSPORT \u003d None"},{"line_number":38,"context_line":"NOTIFICATION_TRANSPORT \u003d None"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_a836f7e4","line":35,"in_reply_to":"dada55a8_c9a9e825","updated":"2016-07-22 18:12:05.000000000","message":"Maybe if we have more notification options in the future; I don\u0027t think 1 option really deserves its own group. I can move it if there\u0027s an existing group you think is better.","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"ac0af2031c5a246b44539e406cbb9ce57570ddb2","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"def get_sensors_notifier(service\u003dNone, host\u003dNone, publisher_id\u003dNone):"},{"line_number":148,"context_line":"    assert METRICS_NOTIFIER is not None"},{"line_number":149,"context_line":"    if not publisher_id:"},{"line_number":150,"context_line":"        publisher_id \u003d \"%s.%s\" % (service, host or CONF.host)"},{"line_number":151,"context_line":"    return METRICS_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_7ffc893e","line":148,"range":{"start_line":148,"start_character":11,"end_line":148,"end_character":27},"updated":"2016-07-25 08:25:28.000000000","message":"I think this global name should be also renamed like this function.","commit_id":"69d8e451e75a04fd9357d4f5c28fe65df1fa0d4d"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"849cac407aeaa8752e998d8a2dac359c51072a7a","unresolved":false,"context_lines":[{"line_number":145,"context_line":""},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"def get_sensors_notifier(service\u003dNone, host\u003dNone, publisher_id\u003dNone):"},{"line_number":148,"context_line":"    assert METRICS_NOTIFIER is not None"},{"line_number":149,"context_line":"    if not publisher_id:"},{"line_number":150,"context_line":"        publisher_id \u003d \"%s.%s\" % (service, host or CONF.host)"},{"line_number":151,"context_line":"    return METRICS_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_dcfe4d6a","line":148,"range":{"start_line":148,"start_character":11,"end_line":148,"end_character":27},"in_reply_to":"dada55a8_7ffc893e","updated":"2016-07-25 15:40:30.000000000","message":"Good catch, done and updated tests to match","commit_id":"69d8e451e75a04fd9357d4f5c28fe65df1fa0d4d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":155,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":156,"context_line":"    assert publisher_id is not None"},{"line_number":157,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_2f234a07","line":156,"updated":"2016-07-27 17:10:57.000000000","message":"i really hate asserts in production code, but looks like we are already using that.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":153,"context_line":""},{"line_number":154,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":155,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":156,"context_line":"    assert publisher_id is not None"},{"line_number":157,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_d47dd2e8","line":156,"in_reply_to":"bacf61ea_2f234a07","updated":"2016-07-27 22:25:38.000000000","message":"Yeah. I\u0027m guessing the logic behind the original assert was to make a crash happen on startup if the basic connection to the RPC transport used to talk to the conductors failed, since that\u0027s very necessary. It was probably just copied everywhere after that.\n\nWhat would you think about removing the asserts from get_versioned_notifier here and get_sensors_notifier above, but leaving in the one under get_server?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        aliases\u003dTRANSPORT_ALIASES)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    serializer \u003d RequestContextSerializer(messaging.JsonPayloadSerializer())"},{"line_number":55,"context_line":"    SENSORS_NOTIFIER \u003d messaging.Notifier(TRANSPORT,"},{"line_number":56,"context_line":"                                          serializer\u003dserializer)"},{"line_number":57,"context_line":"    if conf.notification_level is None:"},{"line_number":58,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_0f688086","line":55,"range":{"start_line":55,"start_character":42,"end_line":55,"end_character":51},"updated":"2016-08-10 14:37:57.000000000","message":"Shouldn\u0027t we still use NOTIFICATION_TRANSPORT here? It may have used a different url before - https://github.com/openstack/oslo.messaging/blob/master/oslo_messaging/notify/notifier.py#L144","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        aliases\u003dTRANSPORT_ALIASES)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":"    serializer \u003d RequestContextSerializer(messaging.JsonPayloadSerializer())"},{"line_number":55,"context_line":"    SENSORS_NOTIFIER \u003d messaging.Notifier(TRANSPORT,"},{"line_number":56,"context_line":"                                          serializer\u003dserializer)"},{"line_number":57,"context_line":"    if conf.notification_level is None:"},{"line_number":58,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_61dd3614","line":55,"range":{"start_line":55,"start_character":42,"end_line":55,"end_character":51},"in_reply_to":"9ad45d7e_0f688086","updated":"2016-08-19 21:08:47.000000000","message":"You\u0027re right. Done.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"aeb36fe8d0b567d414457bc62cc47dd81a56a368","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":150,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":151,"context_line":"    assert publisher_id is not None"},{"line_number":152,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_279fa251","line":151,"updated":"2016-08-16 09:21:21.000000000","message":"Looks strange, why \"publisher_id\" param is not mandatory?","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":148,"context_line":""},{"line_number":149,"context_line":"def get_versioned_notifier(publisher_id\u003dNone):"},{"line_number":150,"context_line":"    assert VERSIONED_NOTIFIER is not None"},{"line_number":151,"context_line":"    assert publisher_id is not None"},{"line_number":152,"context_line":"    return VERSIONED_NOTIFIER.prepare(publisher_id\u003dpublisher_id)"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_21f33ea0","line":151,"in_reply_to":"3ac371cc_279fa251","updated":"2016-08-19 21:08:47.000000000","message":"This is saying that it is mandatory, since I\u0027m asserting it\u0027s not None. A publisher_id is needed so we know which part of ironic sent the notification.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c60fd52c42dcd6079215e136c8b97ef2f3e1e7ca","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    if conf.notification_level is None:"},{"line_number":58,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":59,"context_line":"                                                serializer\u003dserializer,"},{"line_number":60,"context_line":"                                                driver\u003d\u0027noop\u0027)"},{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":63,"context_line":"                                                serializer\u003dserializer,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_95831056","line":60,"updated":"2016-08-22 10:56:29.000000000","message":"why driver was changed? by default it is None.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    if conf.notification_level is None:"},{"line_number":58,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":59,"context_line":"                                                serializer\u003dserializer,"},{"line_number":60,"context_line":"                                                driver\u003d\u0027noop\u0027)"},{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":63,"context_line":"                                                serializer\u003dserializer,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_3bd79924","line":60,"in_reply_to":"1ac06dbe_493101ec","updated":"2016-08-22 16:07:07.000000000","message":"Exactly.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dad92c93c129dc7e3aa0f3fb5ca91ec32fb5ca32","unresolved":false,"context_lines":[{"line_number":57,"context_line":"    if conf.notification_level is None:"},{"line_number":58,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":59,"context_line":"                                                serializer\u003dserializer,"},{"line_number":60,"context_line":"                                                driver\u003d\u0027noop\u0027)"},{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":63,"context_line":"                                                serializer\u003dserializer,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_493101ec","line":60,"in_reply_to":"1ac06dbe_95831056","updated":"2016-08-22 11:48:17.000000000","message":"That\u0027s because if it is None, the one specified in the config will be used, we don\u0027t need it if notifications are disabled. It is None on L62 and that\u0027s where we need it.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"c537878e4423f389c18be772cca1a9e5723b8e6c","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":63,"context_line":"                                                serializer\u003dserializer,"},{"line_number":64,"context_line":"                                                topics\u003d[\u0027ironic_versioned_\u0027"},{"line_number":65,"context_line":"                                                        \u0027notifications\u0027])"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_0174f8fa","line":64,"updated":"2016-08-22 14:27:42.000000000","message":"Please add this hardcoded topic to the documentation because it\u0027s needed for configuring notifications consumers.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":61,"context_line":"    else:"},{"line_number":62,"context_line":"        VERSIONED_NOTIFIER \u003d messaging.Notifier(NOTIFICATION_TRANSPORT,"},{"line_number":63,"context_line":"                                                serializer\u003dserializer,"},{"line_number":64,"context_line":"                                                topics\u003d[\u0027ironic_versioned_\u0027"},{"line_number":65,"context_line":"                                                        \u0027notifications\u0027])"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_3b8cb934","line":64,"in_reply_to":"1ac06dbe_0174f8fa","updated":"2016-08-22 16:07:07.000000000","message":"Done","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"}],"ironic/conductor/utils.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                    \"Failed to change power state to \u0027%(target)s\u0027. \""},{"line_number":90,"context_line":"                    \"Error: %(error)s\") % {\u0027target\u0027: new_state, \u0027error\u0027: e}"},{"line_number":91,"context_line":"                node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":92,"context_line":"                notif_payload \u003d node_objects.NodeSetPowerStatePayload("},{"line_number":93,"context_line":"                    target_power_state\u003dstates.NOSTATE)"},{"line_number":94,"context_line":"                notif_payload.populate_schema(node\u003dnode)"},{"line_number":95,"context_line":"                # NOTE(mariojv) We no longer have direct access to the"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_0682a4c8","line":92,"updated":"2016-04-08 08:59:47.000000000","message":"This code is mostly duplicated, better refactor to helper func.","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":89,"context_line":"                    \"Failed to change power state to \u0027%(target)s\u0027. \""},{"line_number":90,"context_line":"                    \"Error: %(error)s\") % {\u0027target\u0027: new_state, \u0027error\u0027: e}"},{"line_number":91,"context_line":"                node[\u0027target_power_state\u0027] \u003d states.NOSTATE"},{"line_number":92,"context_line":"                notif_payload \u003d node_objects.NodeSetPowerStatePayload("},{"line_number":93,"context_line":"                    target_power_state\u003dstates.NOSTATE)"},{"line_number":94,"context_line":"                notif_payload.populate_schema(node\u003dnode)"},{"line_number":95,"context_line":"                # NOTE(mariojv) We no longer have direct access to the"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_2bd4a845","line":92,"in_reply_to":"9a061dce_0682a4c8","updated":"2016-04-08 20:56:55.000000000","message":"Agreed, done. Also used the new helper function in conductor/manager.","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                # in the config, if it\u0027s available."},{"line_number":98,"context_line":"                node_objects.NodeSetPowerStateNotification("},{"line_number":99,"context_line":"                    publisher\u003dnotification.NotificationPublisher("},{"line_number":100,"context_line":"                        {\u0027service\u0027: \u0027conductor\u0027, \u0027host\u0027: CONF.host}),"},{"line_number":101,"context_line":"                    event_type\u003dnotification.EventType("},{"line_number":102,"context_line":"                        object\u003d\u0027node\u0027, action\u003d\u0027set_power_state\u0027, phase\u003d\u0027fail\u0027),"},{"line_number":103,"context_line":"                    priority\u003dfields.NotificationPriority.ERROR,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_6bba490c","line":100,"updated":"2016-04-08 08:59:47.000000000","message":"This is strange argument - one dict, __init__ here should be base init: https://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L300","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":97,"context_line":"                # in the config, if it\u0027s available."},{"line_number":98,"context_line":"                node_objects.NodeSetPowerStateNotification("},{"line_number":99,"context_line":"                    publisher\u003dnotification.NotificationPublisher("},{"line_number":100,"context_line":"                        {\u0027service\u0027: \u0027conductor\u0027, \u0027host\u0027: CONF.host}),"},{"line_number":101,"context_line":"                    event_type\u003dnotification.EventType("},{"line_number":102,"context_line":"                        object\u003d\u0027node\u0027, action\u003d\u0027set_power_state\u0027, phase\u003d\u0027fail\u0027),"},{"line_number":103,"context_line":"                    priority\u003dfields.NotificationPriority.ERROR,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_cbc36c89","line":100,"in_reply_to":"9a061dce_6bba490c","updated":"2016-04-08 20:56:55.000000000","message":"Fixed in helper function","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            # if it\u0027s available."},{"line_number":130,"context_line":"            node_objects.NodeSetPowerStateNotification("},{"line_number":131,"context_line":"                publisher\u003dnotification.NotificationPublisher("},{"line_number":132,"context_line":"                    {\u0027service\u0027: \u0027conductor\u0027, \u0027host\u0027: CONF.host}),"},{"line_number":133,"context_line":"                event_type\u003dnotification.EventType("},{"line_number":134,"context_line":"                    object\u003d\u0027node\u0027, action\u003d\u0027set_power_state\u0027, phase\u003d\u0027end\u0027),"},{"line_number":135,"context_line":"                priority\u003dfields.NotificationPriority.WARN,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_4bf825c5","line":132,"updated":"2016-04-08 08:59:47.000000000","message":"ditto and below","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":129,"context_line":"            # if it\u0027s available."},{"line_number":130,"context_line":"            node_objects.NodeSetPowerStateNotification("},{"line_number":131,"context_line":"                publisher\u003dnotification.NotificationPublisher("},{"line_number":132,"context_line":"                    {\u0027service\u0027: \u0027conductor\u0027, \u0027host\u0027: CONF.host}),"},{"line_number":133,"context_line":"                event_type\u003dnotification.EventType("},{"line_number":134,"context_line":"                    object\u003d\u0027node\u0027, action\u003d\u0027set_power_state\u0027, phase\u003d\u0027end\u0027),"},{"line_number":135,"context_line":"                priority\u003dfields.NotificationPriority.WARN,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_4b363cb5","line":132,"in_reply_to":"9a061dce_4bf825c5","updated":"2016-04-08 20:56:55.000000000","message":"Fixed in helper function","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c48f8b9471fca254dee8ead0970424fcd4cb48bb","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    \"\"\""},{"line_number":103,"context_line":"    node \u003d task.node"},{"line_number":104,"context_line":"    target_state \u003d states.POWER_ON if new_state \u003d\u003d states.REBOOT else new_state"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    if new_state !\u003d states.REBOOT:"},{"line_number":107,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_00d23ad2","line":104,"updated":"2016-04-14 09:13:42.000000000","message":"Should we notify about power state change start if we notify about the end?","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":101,"context_line":""},{"line_number":102,"context_line":"    \"\"\""},{"line_number":103,"context_line":"    node \u003d task.node"},{"line_number":104,"context_line":"    target_state \u003d states.POWER_ON if new_state \u003d\u003d states.REBOOT else new_state"},{"line_number":105,"context_line":""},{"line_number":106,"context_line":"    if new_state !\u003d states.REBOOT:"},{"line_number":107,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_08a20e99","line":104,"in_reply_to":"5a18252c_00d23ad2","updated":"2016-04-21 23:16:11.000000000","message":"We notify about the .start before entering this function. See change_node_power_state in the ConductorManager for an example. I put it there so that we know that an attempted power action was started and didn\u0027t finish if something like power validation failed.\n\nI\u0027m also adding a start notification in do_sync_power_state in the next patch set to catch the case that Jay mentioned in another comment.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"}],"ironic/conf/default.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"84feef9a322374b86a3f7afe19179e7c833345e2","unresolved":false,"context_lines":[{"line_number":154,"context_line":"# NOTE(mariojv) By default, accessing this option when it\u0027s undefined will"},{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_7f5cb3ed","line":157,"updated":"2016-07-22 18:14:42.000000000","message":"Had to move the config option here to match the new config style during a rebase.\n\nI had to outline the choices explicitly here instead of using fields.NotificationPriority as before, otherwise we\u0027d have a circular import and generating the sample config would fail.","commit_id":"69d8e451e75a04fd9357d4f5c28fe65df1fa0d4d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_4f0cbe42","line":158,"updated":"2016-07-27 17:10:57.000000000","message":"I tend to this of this as a notification_level, not a priority. (Similar to \u0027log level\u0027). Wondering why you think of it as a \u0027priority\u0027.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"44a06ac9442bf66bc301969a6956276dda50a9b9","unresolved":false,"context_lines":[{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_57ba440b","line":158,"in_reply_to":"bacf61ea_14176a52","updated":"2016-07-28 22:37:32.000000000","message":"I think the terminology we use, ought to be something that makes sense to the end user. And that we are consistent with how we use it. \u0027Priority\u0027 to me has different connotations than \u0027level\u0027, but I don\u0027t know what the notification-world speak is like.\n\nAre there other projects that have notifications, and if so, do they have config options? I suppose we could at least try to be consistent with those.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":12459,"name":"Stephanie Miller","email":"stephane@alum.mit.edu","username":"cinerama"},"change_message_id":"dc66b3e7f437928db8212042bf1769bf96933ec6","unresolved":false,"context_lines":[{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_e3b949ee","line":158,"in_reply_to":"bacf61ea_4f0cbe42","updated":"2016-07-27 19:52:48.000000000","message":"They are described as \"priorities\" in the spec.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0eff0dacc76242237a3d66e111b437fe419d2e7b","unresolved":false,"context_lines":[{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"9ad45d7e_7b2210bb","line":158,"in_reply_to":"bacf61ea_57ba440b","updated":"2016-08-08 17:22:30.000000000","message":"Changed to notification_level. I guess that might make more sense, since \"priority\" could implicitly hint that the notification still gets sent.\n\nNova has notifications, not sure about the config options. I don\u0027t think that they have config options for priority/level.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":155,"context_line":"# return None, indicating no notifications will be sent. oslo.config returns"},{"line_number":156,"context_line":"# None by default for options without set defaults that aren\u0027t required."},{"line_number":157,"context_line":"notification_opts \u003d ["},{"line_number":158,"context_line":"    cfg.StrOpt(\u0027notification_priority\u0027,"},{"line_number":159,"context_line":"               choices\u003d[\u0027debug\u0027, \u0027info\u0027, \u0027warning\u0027, \u0027error\u0027, \u0027critical\u0027],"},{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_14176a52","line":158,"in_reply_to":"bacf61ea_e3b949ee","updated":"2016-07-27 22:25:38.000000000","message":"They\u0027re referred to both ways in different places it seems. http://docs.openstack.org/developer/oslo.messaging/notifier.html\n\nIn the actual message payload on the queue, there\u0027s a \"priority\" field that maps to these values. You can see that in the format description on the page I linked. For each separate function that actually emits the message, however, the docstrings refer to them as \"levels.\"\n\nI tend to prefer \"priority\" since it maps to the actual payload, but I don\u0027t really have a strong preference either way.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"},{"line_number":162,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"},{"line_number":163,"context_line":"                      \u0027undefined.\u0027))"},{"line_number":164,"context_line":"]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"path_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_1220299b","line":163,"updated":"2016-07-27 17:10:57.000000000","message":"\u0027define\u0027 might be the right term. Would be good to find out. I\u0027ve always thought of it as \u0027if not explicitly specified/set it defaults to None\u0027. A quick search through the existing configs shows that descriptions tend to use \u0027set\u0027 or \u0027None\u0027 to describe this.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":160,"context_line":"               help\u003d_(\u0027Specifies the minimum priority for which to send \u0027"},{"line_number":161,"context_line":"                      \u0027notifications. If not defined, no notifications will \u0027"},{"line_number":162,"context_line":"                      \u0027be sent. The default is for this option to be \u0027"},{"line_number":163,"context_line":"                      \u0027undefined.\u0027))"},{"line_number":164,"context_line":"]"},{"line_number":165,"context_line":""},{"line_number":166,"context_line":"path_opts \u003d ["}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_0f2597aa","line":163,"in_reply_to":"bacf61ea_1220299b","updated":"2016-07-27 22:25:38.000000000","message":"Switched to \"set\" to match existing descriptions.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"}],"ironic/objects/fields.py":[{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"5b28c1fbbc9b3f80ad52d27813540894ed701a40","unresolved":false,"context_lines":[{"line_number":14,"context_line":"#    under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"import ast"},{"line_number":17,"context_line":"import functools"},{"line_number":18,"context_line":"import six"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"from oslo_versionedobjects import fields as object_fields"}],"source_content_type":"text/x-python","patch_set":1,"id":"ba0121b8_7eaf97e3","line":17,"updated":"2016-03-28 23:13:49.000000000","message":"note to self: remove extraneous import here","commit_id":"71083e2ec6d73dce9c1b7e51a41e106c4362a52b"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    DEBUG \u003d \u0027debug\u0027"},{"line_number":74,"context_line":"    INFO \u003d \u0027info\u0027"},{"line_number":75,"context_line":"    WARNING \u003d \u0027warning\u0027"},{"line_number":76,"context_line":"    AUDIT \u003d \u0027audit\u0027"},{"line_number":77,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":78,"context_line":"    CRITICAL \u003d \u0027critical\u0027"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_1a91f799","line":76,"updated":"2016-06-29 07:06:53.000000000","message":"audit is marked for removal in http://specs.openstack.org/openstack/openstack-specs/specs/log-guidelines.html#definition-of-log-levels so I don\u0027t think we should have it too","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":73,"context_line":"    DEBUG \u003d \u0027debug\u0027"},{"line_number":74,"context_line":"    INFO \u003d \u0027info\u0027"},{"line_number":75,"context_line":"    WARNING \u003d \u0027warning\u0027"},{"line_number":76,"context_line":"    AUDIT \u003d \u0027audit\u0027"},{"line_number":77,"context_line":"    ERROR \u003d \u0027error\u0027"},{"line_number":78,"context_line":"    CRITICAL \u003d \u0027critical\u0027"},{"line_number":79,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_99e4bce0","line":76,"in_reply_to":"3aaa91ec_1a91f799","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"}],"ironic/objects/notification.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"           A notification is sent when the priority of the notification is"},{"line_number":71,"context_line":"           greater than or equal to the priority specified in the"},{"line_number":72,"context_line":"           configuration, in the increasing order of DEBUG, INFO, WARN, ERROR."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        priorities_in_order \u003d [fields.NotificationPriority.DEBUG,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_cb027572","line":72,"updated":"2016-04-08 08:59:47.000000000","message":":return:?","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"           A notification is sent when the priority of the notification is"},{"line_number":71,"context_line":"           greater than or equal to the priority specified in the"},{"line_number":72,"context_line":"           configuration, in the increasing order of DEBUG, INFO, WARN, ERROR."},{"line_number":73,"context_line":"        \"\"\""},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"        priorities_in_order \u003d [fields.NotificationPriority.DEBUG,"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_eb68f089","line":72,"in_reply_to":"9a061dce_cb027572","updated":"2016-04-08 20:56:55.000000000","message":"Done","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"935c3f57273603215f44fb667206e6c715f0f58b","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                               fields.NotificationPriority.ERROR]"},{"line_number":79,"context_line":"        if CONF.notification_priority is None:"},{"line_number":80,"context_line":"            return False"},{"line_number":81,"context_line":"        elif CONF.notification_priority \u003d\u003d fields.NotificationPriority.DEBUG:"},{"line_number":82,"context_line":"            return True"},{"line_number":83,"context_line":"        elif CONF.notification_priority \u003d\u003d fields.NotificationPriority.INFO:"},{"line_number":84,"context_line":"            return self.priority in priorities_in_order[1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_46677cea","line":81,"updated":"2016-04-08 08:59:47.000000000","message":"What about code like\n\n _NOTIFY_PRIORITIES \u003d { ... DEBUG: 0, ... INFO: 1 ..}\n return _NOTIFY_PRIORITIES[self.priority] \u003e\u003d _NOTIFY_PRIORITIES[CONF.notification_priority]","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"303b7e8ca20a12fb0c21f1826d6a38638490d270","unresolved":false,"context_lines":[{"line_number":78,"context_line":"                               fields.NotificationPriority.ERROR]"},{"line_number":79,"context_line":"        if CONF.notification_priority is None:"},{"line_number":80,"context_line":"            return False"},{"line_number":81,"context_line":"        elif CONF.notification_priority \u003d\u003d fields.NotificationPriority.DEBUG:"},{"line_number":82,"context_line":"            return True"},{"line_number":83,"context_line":"        elif CONF.notification_priority \u003d\u003d fields.NotificationPriority.INFO:"},{"line_number":84,"context_line":"            return self.priority in priorities_in_order[1:]"}],"source_content_type":"text/x-python","patch_set":3,"id":"9a061dce_abe39804","line":81,"in_reply_to":"9a061dce_46677cea","updated":"2016-04-08 20:56:55.000000000","message":"I think that\u0027s better.\n\nI did it with a special case for None, and I used lowercase since this doesn\u0027t really need to be used in a non local scope. Let me know if this is OK.","commit_id":"7609a9035b07c2610df6d4e6a9cca963f7de6ad2"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c48f8b9471fca254dee8ead0970424fcd4cb48bb","unresolved":false,"context_lines":[{"line_number":117,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":118,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # SCHEMA defines how to populate the payload fields. It is a dictionary"},{"line_number":121,"context_line":"    # where every key value pair has the following format:"},{"line_number":122,"context_line":"    # \u003cpayload_field_name\u003e: (\u003cdata_source_name\u003e,"},{"line_number":123,"context_line":"    #                        \u003cfield_of_the_data_source\u003e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_14b8bfe4","line":120,"updated":"2016-04-14 09:13:42.000000000","message":"Could you add that it is optional and present just for convenience?","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":117,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":118,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":119,"context_line":""},{"line_number":120,"context_line":"    # SCHEMA defines how to populate the payload fields. It is a dictionary"},{"line_number":121,"context_line":"    # where every key value pair has the following format:"},{"line_number":122,"context_line":"    # \u003cpayload_field_name\u003e: (\u003cdata_source_name\u003e,"},{"line_number":123,"context_line":"    #                        \u003cfield_of_the_data_source\u003e)"}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_68c2a235","line":120,"in_reply_to":"5a18252c_14b8bfe4","updated":"2016-04-21 23:16:11.000000000","message":"Yeah, I\u0027ll add that in the next patch set. It\u0027s in the docs but I think here would be good too.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13362,"name":"Tan Lin","email":"lin.tan@intel.com","username":"zero"},"change_message_id":"c00e06792ff94c4efef6a4089715960bbd885923","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            # obj_to_primitive. This is unneeded since every field of the"},{"line_number":104,"context_line":"            # object will look changed, since each payload is a newly created"},{"line_number":105,"context_line":"            # object, so we drop the changes."},{"line_number":106,"context_line":"            self.payload.obj_reset_changes(recursive\u003dFalse)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            self._emit("},{"line_number":109,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_4e9fe75e","line":106,"range":{"start_line":106,"start_character":43,"end_line":106,"end_character":59},"updated":"2016-05-11 08:46:30.000000000","message":"recursive\u003dFalse by default actually","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"21dfcb812099c51a0752d3cb6b0536ea13eb9115","unresolved":false,"context_lines":[{"line_number":103,"context_line":"            # obj_to_primitive. This is unneeded since every field of the"},{"line_number":104,"context_line":"            # object will look changed, since each payload is a newly created"},{"line_number":105,"context_line":"            # object, so we drop the changes."},{"line_number":106,"context_line":"            self.payload.obj_reset_changes(recursive\u003dFalse)"},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"            self._emit("},{"line_number":109,"context_line":"                context,"}],"source_content_type":"text/x-python","patch_set":8,"id":"dab17558_9384490b","line":106,"range":{"start_line":106,"start_character":43,"end_line":106,"end_character":59},"in_reply_to":"dab17558_4e9fe75e","updated":"2016-05-11 13:49:08.000000000","message":"Removed","commit_id":"4605d329a104ac68793256105a37ed5dae22a2c8"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def to_notification_event_type_field(self):"},{"line_number":42,"context_line":"        s \u003d \u0027baremetal.%s.%s\u0027 % (self.object, self.action)"},{"line_number":43,"context_line":"        if self.obj_attr_is_set(\u0027phase\u0027) and self.phase is not None:"},{"line_number":44,"context_line":"            s +\u003d \u0027.%s\u0027 % self.phase"},{"line_number":45,"context_line":"        return s"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_5a825f53","line":44,"updated":"2016-06-29 07:06:53.000000000","message":"nit: I\u0027d slightly prefer code like:\n\n parts \u003d [\u0027baremetal\u0027, self.object, self.action]\n if ...:\n   parts.append(self.phase)\n return \u0027.\u0027.join(parts)","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":41,"context_line":"    def to_notification_event_type_field(self):"},{"line_number":42,"context_line":"        s \u003d \u0027baremetal.%s.%s\u0027 % (self.object, self.action)"},{"line_number":43,"context_line":"        if self.obj_attr_is_set(\u0027phase\u0027) and self.phase is not None:"},{"line_number":44,"context_line":"            s +\u003d \u0027.%s\u0027 % self.phase"},{"line_number":45,"context_line":"        return s"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_7937504d","line":44,"in_reply_to":"3aaa91ec_5a825f53","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            fields.NotificationPriority.WARNING: 3,"},{"line_number":83,"context_line":"            fields.NotificationPriority.ERROR: 4,"},{"line_number":84,"context_line":"            fields.NotificationPriority.CRITICAL: 5"},{"line_number":85,"context_line":"        }"},{"line_number":86,"context_line":"        if CONF.notification_priority is None:"},{"line_number":87,"context_line":"            return False"},{"line_number":88,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_3a85d358","line":85,"updated":"2016-06-29 07:06:53.000000000","message":"lets make this a top-level constant","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":82,"context_line":"            fields.NotificationPriority.WARNING: 3,"},{"line_number":83,"context_line":"            fields.NotificationPriority.ERROR: 4,"},{"line_number":84,"context_line":"            fields.NotificationPriority.CRITICAL: 5"},{"line_number":85,"context_line":"        }"},{"line_number":86,"context_line":"        if CONF.notification_priority is None:"},{"line_number":87,"context_line":"            return False"},{"line_number":88,"context_line":"        else:"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_b96b781d","line":85,"in_reply_to":"3aaa91ec_3a85d358","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def emit(self, context):"},{"line_number":98,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":99,"context_line":"        assert self.payload.populated"},{"line_number":100,"context_line":"        if self._should_notify():"},{"line_number":101,"context_line":"            # NOTE(mariojv) By default, oslo_versionedobjects includes a list"},{"line_number":102,"context_line":"            # of \"changed fields\" for the object in the output of"},{"line_number":103,"context_line":"            # obj_to_primitive. This is unneeded since every field of the"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_9a7cc773","line":100,"updated":"2016-06-29 07:06:53.000000000","message":"nit: I\u0027d slightly prefer\n\n if not self_should_notify():\n   return","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":97,"context_line":"    def emit(self, context):"},{"line_number":98,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":99,"context_line":"        assert self.payload.populated"},{"line_number":100,"context_line":"        if self._should_notify():"},{"line_number":101,"context_line":"            # NOTE(mariojv) By default, oslo_versionedobjects includes a list"},{"line_number":102,"context_line":"            # of \"changed fields\" for the object in the output of"},{"line_number":103,"context_line":"            # obj_to_primitive. This is unneeded since every field of the"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_59c89422","line":100,"in_reply_to":"3aaa91ec_9a7cc773","updated":"2016-06-29 18:41:19.000000000","message":"Done","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                       in the SCHEMA"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        for key, (obj, field) in self.SCHEMA.items():"},{"line_number":159,"context_line":"            source \u003d kwargs[obj]"},{"line_number":160,"context_line":"            if source.obj_attr_is_set(field):"},{"line_number":161,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":162,"context_line":"        self.populated \u003d True"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_7a7f5b66","line":159,"updated":"2016-06-29 07:06:53.000000000","message":"I think we should catch KeyError here and provide a meaningful exception instead","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":156,"context_line":"                       in the SCHEMA"},{"line_number":157,"context_line":"        \"\"\""},{"line_number":158,"context_line":"        for key, (obj, field) in self.SCHEMA.items():"},{"line_number":159,"context_line":"            source \u003d kwargs[obj]"},{"line_number":160,"context_line":"            if source.obj_attr_is_set(field):"},{"line_number":161,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":162,"context_line":"        self.populated \u003d True"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_dca472a7","line":159,"in_reply_to":"3aaa91ec_7a7f5b66","updated":"2016-06-29 18:41:19.000000000","message":"Agreed, that would be useful for debugging notifications during development. Let me know if this exception is specific/appropriate enough. This would be an AttributeError since field is an attribute of an object and not necessarily a key of a dict.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            source \u003d kwargs[obj]"},{"line_number":160,"context_line":"            if source.obj_attr_is_set(field):"},{"line_number":161,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":162,"context_line":"        self.populated \u003d True"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"@base.IronicObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_da964f93","line":162,"updated":"2016-06-29 07:06:53.000000000","message":"how is this field used? Did you mean to put\n\n if self.populated:\n   return\n\nin the beginning?","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":159,"context_line":"            source \u003d kwargs[obj]"},{"line_number":160,"context_line":"            if source.obj_attr_is_set(field):"},{"line_number":161,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":162,"context_line":"        self.populated \u003d True"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":""},{"line_number":165,"context_line":"@base.IronicObjectRegistry.register"}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_fc296e9c","line":162,"in_reply_to":"3aaa91ec_da964f93","updated":"2016-06-29 18:41:19.000000000","message":"See the assert in NotificationBase.emit a bit above here. That\u0027s present to ensure we don\u0027t send a notification that doesn\u0027t have values for all fields of its schema defined.\n\nself.populated is an attribute indicating whether all fields of the schema are filled before emitting the notification. In NotificationPayloadBase.__init__, self.populated is set to True if there isn\u0027t a schema, since an empty schema is always fully populated. In this method, we set self.populated to True only after every part of the schema is populated.\n\nThere\u0027s not a problem caused by populating a schema multiple times, so I don\u0027t see the need to return if it\u0027s already populated.\n\nPlease let me know if this makes sense. I can add a comment to this effect if it would clarify this code.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"d45346b85b5f1f79a61f66b7150ecbaefd5448ee","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d cfg.CONF"},{"line_number":22,"context_line":"CONF.import_opt(\u0027notification_priority\u0027, \u0027ironic.common.rpc\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Definition of priority levels in increasing order of severity"}],"source_content_type":"text/x-python","patch_set":20,"id":"dada55a8_3e91ef47","line":22,"range":{"start_line":22,"start_character":42,"end_line":22,"end_character":59},"updated":"2016-07-27 12:29:42.000000000","message":"There is no option in this module, looks like this import_opt is not needed.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d cfg.CONF"},{"line_number":22,"context_line":"CONF.import_opt(\u0027notification_priority\u0027, \u0027ironic.common.rpc\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Definition of priority levels in increasing order of severity"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_cf3b7f9b","line":22,"range":{"start_line":22,"start_character":42,"end_line":22,"end_character":59},"in_reply_to":"bacf61ea_1244a972","updated":"2016-07-27 22:25:38.000000000","message":"Removed","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"CONF \u003d cfg.CONF"},{"line_number":22,"context_line":"CONF.import_opt(\u0027notification_priority\u0027, \u0027ironic.common.rpc\u0027)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"# Definition of priority levels in increasing order of severity"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_1244a972","line":22,"range":{"start_line":22,"start_character":42,"end_line":22,"end_character":59},"in_reply_to":"dada55a8_3e91ef47","updated":"2016-07-27 17:10:57.000000000","message":"++","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"       An EventType must specify the object being acted on, a string describing"},{"line_number":40,"context_line":"       the action being taken on the notification, and the phase of the action,"},{"line_number":41,"context_line":"       if applicable."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    # Version 1.0: Initial version"},{"line_number":44,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_45ddbd6f","line":41,"updated":"2016-07-27 17:10:57.000000000","message":"We don\u0027t tend to indent the description.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":38,"context_line":""},{"line_number":39,"context_line":"       An EventType must specify the object being acted on, a string describing"},{"line_number":40,"context_line":"       the action being taken on the notification, and the phase of the action,"},{"line_number":41,"context_line":"       if applicable."},{"line_number":42,"context_line":"    \"\"\""},{"line_number":43,"context_line":"    # Version 1.0: Initial version"},{"line_number":44,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_0f463723","line":41,"in_reply_to":"bacf61ea_45ddbd6f","updated":"2016-07-27 22:25:38.000000000","message":"Un-indented","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027phase\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":50,"context_line":"    }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def to_notification_event_type_field(self):"},{"line_number":53,"context_line":"        parts \u003d [\u0027baremetal\u0027, self.object, self.action]"},{"line_number":54,"context_line":"        if self.obj_attr_is_set(\u0027phase\u0027) and self.phase is not None:"},{"line_number":55,"context_line":"            parts.append(self.phase)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_c5dc0d1b","line":52,"updated":"2016-07-27 17:10:57.000000000","message":"that is a mouthful. This is just generating the string that will represent the event type, right?\n\nAll this is about notifications, so I don\u0027t know that \u0027to_notification\u0027 is that useful but that\u0027s just my thought.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":49,"context_line":"        \u0027phase\u0027: fields.StringField(nullable\u003dTrue)"},{"line_number":50,"context_line":"    }"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"    def to_notification_event_type_field(self):"},{"line_number":53,"context_line":"        parts \u003d [\u0027baremetal\u0027, self.object, self.action]"},{"line_number":54,"context_line":"        if self.obj_attr_is_set(\u0027phase\u0027) and self.phase is not None:"},{"line_number":55,"context_line":"            parts.append(self.phase)"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_6f72537e","line":52,"in_reply_to":"bacf61ea_c5dc0d1b","updated":"2016-07-27 22:25:38.000000000","message":"Right.\n\nSwitched to \"to_event_type_field\". Maybe \"to_event_type_string\" is better?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":62,"context_line":"class NotificationBase(base.IronicObject):"},{"line_number":63,"context_line":"    \"\"\"Base class for versioned notifications."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Subclasses must define the \"payload\" field."},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":"    # Version 1.0: Initial version"},{"line_number":68,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_e5167154","line":65,"updated":"2016-07-27 17:10:57.000000000","message":"are there any constraints on what the payload field should be?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":62,"context_line":"class NotificationBase(base.IronicObject):"},{"line_number":63,"context_line":"    \"\"\"Base class for versioned notifications."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":"    Subclasses must define the \"payload\" field."},{"line_number":66,"context_line":"    \"\"\""},{"line_number":67,"context_line":"    # Version 1.0: Initial version"},{"line_number":68,"context_line":"    VERSION \u003d \u00271.0\u0027"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_af760b3c","line":65,"in_reply_to":"bacf61ea_e5167154","updated":"2016-07-27 22:25:38.000000000","message":"Yes, it has to be a subclass of NotificationPayloadBase. The docs have a decent example of this but I made it explicit in the docstring here in the newer patch set.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def emit(self, context):"},{"line_number":100,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":101,"context_line":"        assert self.payload.populated"},{"line_number":102,"context_line":"        if not self._should_notify():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_05abc58a","line":101,"updated":"2016-07-27 17:10:57.000000000","message":"yuck. I\u0027d prefer we didn\u0027t assert here. That\u0027ll take down the service. Don\u0027t we usually raise exceptions?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":98,"context_line":""},{"line_number":99,"context_line":"    def emit(self, context):"},{"line_number":100,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":101,"context_line":"        assert self.payload.populated"},{"line_number":102,"context_line":"        if not self._should_notify():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_2f9fbb04","line":101,"in_reply_to":"bacf61ea_05abc58a","updated":"2016-07-27 22:25:38.000000000","message":"Changed this to a new exception type. Let me know if you think I should include any additional info in the exception. I was thinking of including something like self.__class__.__name__ which should provide the name of whatever notification is being sent, but that\u0027s kind of ugly.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# NOTE(mariojv) This class will not be used directly and is just a base class"},{"line_number":121,"context_line":"# for notifications, so we don\u0027t need to register it."},{"line_number":122,"context_line":"@base.IronicObjectRegistry.register_if(False)"},{"line_number":123,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":124,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_687418fd","line":123,"updated":"2016-07-27 17:10:57.000000000","message":"I was just wondering. If this base class is modified, does it mean that any/all registered classes that inherit from this, need to have their versions up\u0027d?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"0eff0dacc76242237a3d66e111b437fe419d2e7b","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# NOTE(mariojv) This class will not be used directly and is just a base class"},{"line_number":121,"context_line":"# for notifications, so we don\u0027t need to register it."},{"line_number":122,"context_line":"@base.IronicObjectRegistry.register_if(False)"},{"line_number":123,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":124,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"}],"source_content_type":"text/x-python","patch_set":20,"id":"9ad45d7e_f6c0d7e2","line":123,"in_reply_to":"bacf61ea_1750cc5d","updated":"2016-08-08 17:22:30.000000000","message":"Actually your original suspicion was correct. I did this test with the NotificationBase class just now.\n\nI had to update the hash of NodeSetPowerStateNotification and NodeSyncPowerStateNotification in https://review.openstack.org/#/c/321865/ after switching the \"priority\" field to \"level\" in the base class.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"44a06ac9442bf66bc301969a6956276dda50a9b9","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# NOTE(mariojv) This class will not be used directly and is just a base class"},{"line_number":121,"context_line":"# for notifications, so we don\u0027t need to register it."},{"line_number":122,"context_line":"@base.IronicObjectRegistry.register_if(False)"},{"line_number":123,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":124,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_1750cc5d","line":123,"in_reply_to":"bacf61ea_610f07e2","updated":"2016-07-28 22:37:32.000000000","message":"It would be good to verify this. I suppose we could change this, and then see if the md5 hash value changes? (or not, I don\u0027t really know the versioned object stuff that well).","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":120,"context_line":"# NOTE(mariojv) This class will not be used directly and is just a base class"},{"line_number":121,"context_line":"# for notifications, so we don\u0027t need to register it."},{"line_number":122,"context_line":"@base.IronicObjectRegistry.register_if(False)"},{"line_number":123,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":124,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_610f07e2","line":123,"in_reply_to":"bacf61ea_687418fd","updated":"2016-07-27 22:25:38.000000000","message":"Not necessarily, I think.\n\noslo.versionedobjects doesn\u0027t seem to specify: http://docs.openstack.org/developer/oslo.versionedobjects/api/base.html#oslo_versionedobjects.base.VersionedObject","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":165,"context_line":"            except AttributeError:"},{"line_number":166,"context_line":"                if not self.fields[field].nullable:"},{"line_number":167,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":168,"context_line":"                                                            field\u003dfield)"},{"line_number":169,"context_line":"        self.populated \u003d True"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_68eff8b0","line":166,"updated":"2016-07-27 17:10:57.000000000","message":"is it self.fields[field] or self.fields[key]? (Aren\u0027t you trying to set self.key?)","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            try:"},{"line_number":164,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":165,"context_line":"            except AttributeError:"},{"line_number":166,"context_line":"                if not self.fields[field].nullable:"},{"line_number":167,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":168,"context_line":"                                                            field\u003dfield)"},{"line_number":169,"context_line":"        self.populated \u003d True"}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_c146b3be","line":166,"in_reply_to":"bacf61ea_68eff8b0","updated":"2016-07-27 22:25:38.000000000","message":"You\u0027re right. I didn\u0027t catch this because in the normal case key \u003d\u003d field, like in this example:\n\n    SCHEMA \u003d {\n         \u0027some_node_field\u0027: (\u0027node\u0027, \u0027some_node_field\u0027)\n    }\n\n    fields \u003d {\n        \u0027some_node_field\u0027: fields.StringField(nullable\u003dTrue)\n    }\n\nbut this code would do the wrong thing in a case like this:\n\n    SCHEMA \u003d {\n         \u0027some_node_field_renamed\u0027: (\u0027node\u0027, \u0027some_node_field\u0027)\n    }\n\n    fields \u003d {\n        \u0027some_node_field_renamed\u0027: fields.StringField(nullable\u003dTrue)\n    }\n\nsince \"some_node_field\" is not a valid key in \"fields\".","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            except AttributeError:"},{"line_number":166,"context_line":"                if not self.fields[field].nullable:"},{"line_number":167,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":168,"context_line":"                                                            field\u003dfield)"},{"line_number":169,"context_line":"        self.populated \u003d True"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_080c7c93","line":168,"updated":"2016-07-27 17:10:57.000000000","message":"would it be useful to also spit out \u0027key\u0027?","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":165,"context_line":"            except AttributeError:"},{"line_number":166,"context_line":"                if not self.fields[field].nullable:"},{"line_number":167,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":168,"context_line":"                                                            field\u003dfield)"},{"line_number":169,"context_line":"        self.populated \u003d True"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"bacf61ea_415f6372","line":168,"in_reply_to":"bacf61ea_080c7c93","updated":"2016-07-27 22:25:38.000000000","message":"Yes, especially in the second case in the above comment. Done.","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def emit(self, context):"},{"line_number":99,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":100,"context_line":"        if not self.payload.populated:"},{"line_number":101,"context_line":"            raise exception.NotificationPayloadError()"},{"line_number":102,"context_line":"        if not self._should_notify():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_97bddcd9","line":101,"updated":"2016-07-28 22:37:20.000000000","message":"This is most likely a programming error, right? If this happened to you and you were trying to figure out what was wrong, what info would be useful in the error msg? the class name? The event type? (I\u0027m not quite sure w/o actually spending more time thinking about it :))","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":98,"context_line":"    def emit(self, context):"},{"line_number":99,"context_line":"        \"\"\"Send the notification.\"\"\""},{"line_number":100,"context_line":"        if not self.payload.populated:"},{"line_number":101,"context_line":"            raise exception.NotificationPayloadError()"},{"line_number":102,"context_line":"        if not self._should_notify():"},{"line_number":103,"context_line":"            return"},{"line_number":104,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_f5ec98bc","line":101,"in_reply_to":"bacf61ea_97bddcd9","updated":"2016-08-01 17:55:32.000000000","message":"This is a programming error, if my unit tests are doing their job. It means that you never populated the payload with the fields from an object with the necessary fields if you define a payload class that has a SCHEMA.\n\nI think the class name would be most useful. Then, you\u0027d see something like \"Payload not populated when trying to send notification PowerStatusNotification\" and could figure out where you\u0027re sending a PowerStatusNotification.\n\nI updated the message in common/exception.py.\n\nWhat do you think?","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":82,"context_line":"           configuration, in the increasing order of DEBUG, INFO, WARNING,"},{"line_number":83,"context_line":"           ERROR, CRITICAL."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"           :return: True if notification should be sent, False otherwise."},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        if CONF.notification_level is None:"},{"line_number":88,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_a93e8fd7","line":85,"updated":"2016-08-10 14:27:01.000000000","message":"nit: documentation block seems overindented","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":82,"context_line":"           configuration, in the increasing order of DEBUG, INFO, WARNING,"},{"line_number":83,"context_line":"           ERROR, CRITICAL."},{"line_number":84,"context_line":""},{"line_number":85,"context_line":"           :return: True if notification should be sent, False otherwise."},{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        if CONF.notification_level is None:"},{"line_number":88,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_18c69549","line":85,"in_reply_to":"9ad45d7e_a93e8fd7","updated":"2016-08-19 21:08:47.000000000","message":"Fixed","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            return (NOTIFY_LEVELS[self.level] \u003e\u003d"},{"line_number":91,"context_line":"                    NOTIFY_LEVELS[CONF.notification_level])"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _emit(self, context, event_type, publisher_id, payload):"},{"line_number":94,"context_line":"        notifier \u003d rpc.get_versioned_notifier(publisher_id)"},{"line_number":95,"context_line":"        notify \u003d getattr(notifier, self.level)"},{"line_number":96,"context_line":"        notify(context, event_type\u003devent_type, payload\u003dpayload)"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_09287b99","line":93,"updated":"2016-08-10 14:27:01.000000000","message":"nit: I don\u0027t see why split these 3 lines of code in a separate function, could as well stay in emit","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":90,"context_line":"            return (NOTIFY_LEVELS[self.level] \u003e\u003d"},{"line_number":91,"context_line":"                    NOTIFY_LEVELS[CONF.notification_level])"},{"line_number":92,"context_line":""},{"line_number":93,"context_line":"    def _emit(self, context, event_type, publisher_id, payload):"},{"line_number":94,"context_line":"        notifier \u003d rpc.get_versioned_notifier(publisher_id)"},{"line_number":95,"context_line":"        notify \u003d getattr(notifier, self.level)"},{"line_number":96,"context_line":"        notify(context, event_type\u003devent_type, payload\u003dpayload)"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_38f7118e","line":93,"in_reply_to":"9ad45d7e_09287b99","updated":"2016-08-19 21:08:47.000000000","message":"Moved into emit()","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if not self.payload.populated:"},{"line_number":101,"context_line":"            raise exception.NotificationPayloadError("},{"line_number":102,"context_line":"                class_name\u003dself.__class__.__name__)"},{"line_number":103,"context_line":"        if not self._should_notify():"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"},{"line_number":106,"context_line":"        # of \"changed fields\" for the object in the output of"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_af6b34f0","line":103,"updated":"2016-08-10 14:37:57.000000000","message":"Do we still want to check that payload is populated even when we should not notify? Maybe move this to the top?","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        if not self.payload.populated:"},{"line_number":101,"context_line":"            raise exception.NotificationPayloadError("},{"line_number":102,"context_line":"                class_name\u003dself.__class__.__name__)"},{"line_number":103,"context_line":"        if not self._should_notify():"},{"line_number":104,"context_line":"            return"},{"line_number":105,"context_line":"        # NOTE(mariojv) By default, oslo_versionedobjects includes a list"},{"line_number":106,"context_line":"        # of \"changed fields\" for the object in the output of"}],"source_content_type":"text/x-python","patch_set":24,"id":"3ac371cc_d8387d40","line":103,"in_reply_to":"9ad45d7e_af6b34f0","updated":"2016-08-19 21:08:47.000000000","message":"Sounds good, moved.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                       in the SCHEMA"},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        for key, (obj, field) in self.SCHEMA.items():"},{"line_number":163,"context_line":"            source \u003d kwargs[obj]"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":166,"context_line":"            except NotImplementedError:"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_caf77689","line":163,"range":{"start_line":163,"start_character":21,"end_line":163,"end_character":32},"updated":"2016-08-10 14:37:57.000000000","message":"Do we want to also catch KeyError here?","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":160,"context_line":"                       in the SCHEMA"},{"line_number":161,"context_line":"        \"\"\""},{"line_number":162,"context_line":"        for key, (obj, field) in self.SCHEMA.items():"},{"line_number":163,"context_line":"            source \u003d kwargs[obj]"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":166,"context_line":"            except NotImplementedError:"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_56b6fedc","line":163,"range":{"start_line":163,"start_character":21,"end_line":163,"end_character":32},"in_reply_to":"9ad45d7e_caf77689","updated":"2016-08-19 21:08:47.000000000","message":"Yes, that would be raised if an incorrect object was passed to populate_schema. I added a new exception type and raised in here to make it clearer to notification developers.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            source \u003d kwargs[obj]"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":166,"context_line":"            except NotImplementedError:"},{"line_number":167,"context_line":"                if not self.fields[key].nullable:"},{"line_number":168,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":169,"context_line":"                                                            field\u003dfield,"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_ca1f7606","line":166,"range":{"start_line":166,"start_character":19,"end_line":166,"end_character":38},"updated":"2016-08-10 14:37:57.000000000","message":"Hmm, what can be raising it? Did you mean AttributeError?","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":163,"context_line":"            source \u003d kwargs[obj]"},{"line_number":164,"context_line":"            try:"},{"line_number":165,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":166,"context_line":"            except NotImplementedError:"},{"line_number":167,"context_line":"                if not self.fields[key].nullable:"},{"line_number":168,"context_line":"                    raise exception.NotificationSchemaError(obj\u003dobj,"},{"line_number":169,"context_line":"                                                            field\u003dfield,"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_41d8fa53","line":166,"range":{"start_line":166,"start_character":19,"end_line":166,"end_character":38},"in_reply_to":"9ad45d7e_ca1f7606","updated":"2016-08-19 21:08:47.000000000","message":"oslo.versionedobjects seems to be raising this instead of an AttributeError. There\u0027s a unit test showing this in test_notification.py","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dad92c93c129dc7e3aa0f3fb5ca91ec32fb5ca32","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        if CONF.notification_level is None:"},{"line_number":88,"context_line":"            return False"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            return (NOTIFY_LEVELS[self.level] \u003e\u003d"},{"line_number":91,"context_line":"                    NOTIFY_LEVELS[CONF.notification_level])"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_156f202c","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":13},"updated":"2016-08-22 11:48:17.000000000","message":"nit - else not needed.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        \"\"\""},{"line_number":87,"context_line":"        if CONF.notification_level is None:"},{"line_number":88,"context_line":"            return False"},{"line_number":89,"context_line":"        else:"},{"line_number":90,"context_line":"            return (NOTIFY_LEVELS[self.level] \u003e\u003d"},{"line_number":91,"context_line":"                    NOTIFY_LEVELS[CONF.notification_level])"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_1bc61d48","line":89,"range":{"start_line":89,"start_character":8,"end_line":89,"end_character":13},"in_reply_to":"1ac06dbe_156f202c","updated":"2016-08-22 16:07:07.000000000","message":"Removed","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"7d2331a8a8823ad346c61326a6406857453b523c","unresolved":false,"context_lines":[{"line_number":118,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":119,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"},{"line_number":122,"context_line":"    # attribute that subclasses may use to easily populate notifications with"},{"line_number":123,"context_line":"    # data from other objects."},{"line_number":124,"context_line":"    # It is a dictionary where every key value pair has the following format:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_ba3a7e96","line":121,"updated":"2016-08-22 09:11:37.000000000","message":"Maybe move this to documentation?","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":118,"context_line":"class NotificationPayloadBase(base.IronicObject):"},{"line_number":119,"context_line":"    \"\"\"Base class for the payload of versioned notifications.\"\"\""},{"line_number":120,"context_line":""},{"line_number":121,"context_line":"    # SCHEMA defines how to populate the payload fields. It\u0027s an optional"},{"line_number":122,"context_line":"    # attribute that subclasses may use to easily populate notifications with"},{"line_number":123,"context_line":"    # data from other objects."},{"line_number":124,"context_line":"    # It is a dictionary where every key value pair has the following format:"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_d66e1c2e","line":121,"in_reply_to":"1ac06dbe_ba3a7e96","updated":"2016-08-22 16:07:07.000000000","message":"Done","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"dad92c93c129dc7e3aa0f3fb5ca91ec32fb5ca32","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                                              source\u003dkwargs)"},{"line_number":162,"context_line":"            try:"},{"line_number":163,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":164,"context_line":"            except NotImplementedError:"},{"line_number":165,"context_line":"                if not self.fields[key].nullable:"},{"line_number":166,"context_line":"                    raise exception.NotificationSchemaKeyError(obj\u003dobj,"},{"line_number":167,"context_line":"                                                               field\u003dfield,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_a3837655","line":164,"updated":"2016-08-22 11:48:17.000000000","message":"So continuing the discussion from the previous PS, yes, getattr can raise NotImplementedError, but only if the \u0027field\u0027 is in self.fields, otherwise, OVO base metaclass will not create a custom getter for some random field, and AttributeError will be raised. You can try the following:\n\n In [5]: c \u003d chassis.Chassis(nn\u003d11)  # nn attribute will be set even if it is not in chassis fields list\n In [6]: getattr(c, \u0027mm\u0027)  # mm not in self.fields\n ---------------------------------------------------------------------------\n AttributeError                            Traceback (most recent call last)\n \u003cipython-input-6-b76a5c497a1c\u003e in \u003cmodule\u003e()\n ----\u003e 1 getattr(c, \u0027mm\u0027)\n\n AttributeError: \u0027Chassis\u0027 object has no attribute \u0027mm\u0027\n In [7]: getattr(c, \u0027extra\u0027)  # extra is in self.fields\n ---------------------------------------------------------------------------\n NotImplementedError                       Traceback (most recent call last)\n \u003cipython-input-7-e8612b4ab32e\u003e in \u003cmodule\u003e()\n ----\u003e 1 getattr(c, \u0027extra\u0027)\n\nAfter looking at OVO code, the object passed here may redefine obj_loat_attr, eg to do some caching, so in theory getattr can raise anything; setattr calls field.coerce, which can also raise anything for custom fields... I think I\u0027d change to except.Exception here.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":161,"context_line":"                                                              source\u003dkwargs)"},{"line_number":162,"context_line":"            try:"},{"line_number":163,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":164,"context_line":"            except NotImplementedError:"},{"line_number":165,"context_line":"                if not self.fields[key].nullable:"},{"line_number":166,"context_line":"                    raise exception.NotificationSchemaKeyError(obj\u003dobj,"},{"line_number":167,"context_line":"                                                               field\u003dfield,"}],"source_content_type":"text/x-python","patch_set":25,"id":"1ac06dbe_4a2720b6","line":164,"in_reply_to":"1ac06dbe_a3837655","updated":"2016-08-22 16:07:07.000000000","message":"Agreed. Done. Thanks for taking the time to look at OVO code.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9dd2080cdca87f639d23ea856f64a9f7b91054e7","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            try:"},{"line_number":142,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":143,"context_line":"            except Exception:"},{"line_number":144,"context_line":"                if not self.fields[key].nullable:"},{"line_number":145,"context_line":"                    raise exception.NotificationSchemaKeyError(obj\u003dobj,"},{"line_number":146,"context_line":"                                                               field\u003dfield,"},{"line_number":147,"context_line":"                                                               key\u003dkey)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1ac06dbe_6d45d615","line":144,"updated":"2016-08-22 16:39:07.000000000","message":"Discussion:\n\nhttp://eavesdrop.openstack.org/irclogs/%23openstack-ironic/%23openstack-ironic.2016-08-22.log.html#t2016-08-22T15:59:44\n\n(scroll down a little bit from that line)","commit_id":"36286c093af70f3f297748843097d86436c45e49"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"60258c44f4cf1f715f9329ca31a1bafbd64dbba0","unresolved":false,"context_lines":[{"line_number":141,"context_line":"            try:"},{"line_number":142,"context_line":"                setattr(self, key, getattr(source, field))"},{"line_number":143,"context_line":"            except Exception:"},{"line_number":144,"context_line":"                if not self.fields[key].nullable:"},{"line_number":145,"context_line":"                    raise exception.NotificationSchemaKeyError(obj\u003dobj,"},{"line_number":146,"context_line":"                                                               field\u003dfield,"},{"line_number":147,"context_line":"                                                               key\u003dkey)"}],"source_content_type":"text/x-python","patch_set":26,"id":"1ac06dbe_6dce76b5","line":144,"updated":"2016-08-22 16:14:52.000000000","message":"Just for the record after quick irc discussion, this might raise KeyError if key is not in self.fields, so it might be better to raise here in any case, whether the field is nullable or not, as we wanted to pass something in and failed.","commit_id":"36286c093af70f3f297748843097d86436c45e49"}],"ironic/tests/base.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c48f8b9471fca254dee8ead0970424fcd4cb48bb","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        matcher is re-raised on a failure within the recursive loop."},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        if isinstance(expected, six.string_types):"},{"line_number":178,"context_line":"            expected \u003d jsonutils.loads(expected)"},{"line_number":179,"context_line":"        if isinstance(observed, six.string_types):"},{"line_number":180,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_181c3c69","line":178,"updated":"2016-04-14 09:13:42.000000000","message":"Not sure what is this one for - if some fields of an object are strings why not just compare them?","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":175,"context_line":"        matcher is re-raised on a failure within the recursive loop."},{"line_number":176,"context_line":"        \"\"\""},{"line_number":177,"context_line":"        if isinstance(expected, six.string_types):"},{"line_number":178,"context_line":"            expected \u003d jsonutils.loads(expected)"},{"line_number":179,"context_line":"        if isinstance(observed, six.string_types):"},{"line_number":180,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":181,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_6e0ec0e6","line":178,"in_reply_to":"5a18252c_181c3c69","updated":"2016-04-21 23:16:11.000000000","message":"This is operating on the full expected and observed variables themselves, not fields within the objects.\n\nIt\u0027s to catch a case if this function is used on JSON strings that haven\u0027t been converted into Python objects yet and just converts them to objects so we can compare all their values.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"c48f8b9471fca254dee8ead0970424fcd4cb48bb","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":199,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":200,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":201,"context_line":"                  isinstance(observed, (list, tuple, set))):"},{"line_number":202,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"5a18252c_582eb443","line":200,"updated":"2016-04-14 09:13:42.000000000","message":"looking at jsonutils.to_primitive, there are much more cases than covered here. Do we actually need such a complex thing just for unittests? I see it is used only once.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"918a5e1358a9928225232efd1eced50b0253f6f1","unresolved":false,"context_lines":[{"line_number":197,"context_line":""},{"line_number":198,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":199,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":200,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":201,"context_line":"                  isinstance(observed, (list, tuple, set))):"},{"line_number":202,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"1a122d0e_4eaf8494","line":200,"in_reply_to":"5a18252c_582eb443","updated":"2016-04-21 23:16:11.000000000","message":"I needed something to test that the JSON payload is what we expect so just pulled this from Nova. It might be overkill, but I thought it would be useful for testing more complex notifications in the future where one might want a list element in the payload.\n\nI\u0027d be willing to simplify it if you have a suggestion for how to do that, as long as we still have a unit test for verifying the payload schema.","commit_id":"00b5dbf78898a0291c974676d38679144f59690c"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            return root"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def assertJsonEqual(self, expected, observed):"},{"line_number":170,"context_line":"        \"\"\"Asserts that 2 complex data structures are json equivalent."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Sorts internal data structures to avoid false mismatches."}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_9f1e9261","line":169,"updated":"2016-07-28 22:37:20.000000000","message":"i feel like we need a test to test this. Do we normally do that? My other thought is \u0027why isn\u0027t this available in a library?\u0027 :)","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            return root"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def assertJsonEqual(self, expected, observed):"},{"line_number":170,"context_line":"        \"\"\"Asserts that 2 complex data structures are json equivalent."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Sorts internal data structures to avoid false mismatches."}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_d5051446","line":169,"in_reply_to":"bacf61ea_9f1e9261","updated":"2016-08-01 17:55:32.000000000","message":"I ripped this off directly from nova:\n\nhttps://github.com/openstack/nova/blob/32b7526b3cf40f40c5430034f75444fc64ac0e04/nova/test.py#L292\n\nIt doesn\u0027t look like they test it there. :( Do you think I should add a couple tests here? It would be nice to have an example of something that tests our test helpers.\n\nAlternatively, I was thinking we could file a bug with ironic and oslo as a follow-up action to this, to get this into some common library.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":166,"context_line":"        else:"},{"line_number":167,"context_line":"            return root"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def assertJsonEqual(self, expected, observed):"},{"line_number":170,"context_line":"        \"\"\"Asserts that 2 complex data structures are json equivalent."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Sorts internal data structures to avoid false mismatches."}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_909359a3","line":169,"updated":"2016-08-19 21:08:47.000000000","message":"I just changed this to assert that the strings dumped by oslo_serialization jsonutils are equivalent, since the comments indicate that we should care about ordering in lists. \n\nI also used sort_keys\u003dTrue here, since there\u0027s no guarantee that a dict will be sorted the same every time. I think in CPython it happens because of an implementation detail, but it\u0027s not guaranteed by the interface.\n\nOrdering will still be checked for lists with this implementation. It seems to work fine with nested dicts too.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def assertJsonEqual(self, expected, observed):"},{"line_number":170,"context_line":"        \"\"\"Asserts that 2 complex data structures are json equivalent."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Sorts internal data structures to avoid false mismatches."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        Because this is a recursive set of assertions, when failure"},{"line_number":175,"context_line":"        happens we want to expose both the local failure and the"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_49571326","line":172,"updated":"2016-08-10 14:27:01.000000000","message":"I don\u0027t quite agree with it, lists are not equivalent when order differs, and dicts do not require sorting at all..","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":169,"context_line":"    def assertJsonEqual(self, expected, observed):"},{"line_number":170,"context_line":"        \"\"\"Asserts that 2 complex data structures are json equivalent."},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        Sorts internal data structures to avoid false mismatches."},{"line_number":173,"context_line":""},{"line_number":174,"context_line":"        Because this is a recursive set of assertions, when failure"},{"line_number":175,"context_line":"        happens we want to expose both the local failure and the"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_21217efc","line":172,"in_reply_to":"9ad45d7e_49571326","updated":"2016-08-19 21:08:47.000000000","message":"You\u0027re right, order is important for an array in the JSON spec\n\nhttps://tools.ietf.org/html/rfc4627\n\nI ripped this off directly from Nova, so I didn\u0027t inspect it as carefully as I should have.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        if isinstance(expected, six.string_types):"},{"line_number":182,"context_line":"            expected \u003d jsonutils.loads(expected)"},{"line_number":183,"context_line":"        if isinstance(observed, six.string_types):"},{"line_number":184,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_29545f1f","line":184,"updated":"2016-08-10 14:27:01.000000000","message":"just a note: a string is also valid JSON","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":181,"context_line":"        if isinstance(expected, six.string_types):"},{"line_number":182,"context_line":"            expected \u003d jsonutils.loads(expected)"},{"line_number":183,"context_line":"        if isinstance(observed, six.string_types):"},{"line_number":184,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_c16a2a1a","line":184,"in_reply_to":"9ad45d7e_29545f1f","updated":"2016-08-19 21:08:47.000000000","message":"Yes","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"},{"line_number":188,"context_line":"                return str(x)"},{"line_number":189,"context_line":"            if isinstance(x, dict):"},{"line_number":190,"context_line":"                items \u003d ((sort_key(key), sort_key(value))"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_29ee1fb4","line":187,"range":{"start_line":187,"start_character":29,"end_line":187,"end_character":40},"updated":"2016-08-10 14:37:57.000000000","message":"I don\u0027t really know why to convert sets or lists (but not tuples?) to a string here.\n\nEg you have\n\n expected \u003d [[1,2], {3,4}]\n observed \u003d [(1,2), (3,4)]\n\nAre these considered json equivalent? With the current approach they will not, as \u0027set([3,4])\u0027 !\u003d \u0027(3,4)\u0027 and \u0027[1,2]\u0027 !\u003d \u0027(1,2)\u0027.\n\nIf I follow the code correctly, it seems that in case of all the iterables we should be just doing return x, and the code on L204 will continue to process those.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":184,"context_line":"            observed \u003d jsonutils.loads(observed)"},{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"},{"line_number":188,"context_line":"                return str(x)"},{"line_number":189,"context_line":"            if isinstance(x, dict):"},{"line_number":190,"context_line":"                items \u003d ((sort_key(key), sort_key(value))"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_1c35c5d9","line":187,"range":{"start_line":187,"start_character":29,"end_line":187,"end_character":40},"in_reply_to":"9ad45d7e_29ee1fb4","updated":"2016-08-19 21:08:47.000000000","message":"Good point. Sets aren\u0027t even json serializable in Python:\n\nhttps://gist.github.com/supermari0/b0ba2c2d600506af25d5e00752f42ec4\n\nTuples are, but they\u0027re converted to a list (\"array\" in json terminology).","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"},{"line_number":188,"context_line":"                return str(x)"},{"line_number":189,"context_line":"            if isinstance(x, dict):"},{"line_number":190,"context_line":"                items \u003d ((sort_key(key), sort_key(value))"},{"line_number":191,"context_line":"                         for key, value in x.items())"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_8933cb13","line":188,"updated":"2016-08-10 14:27:01.000000000","message":"str(set(x)) depends on set traversal ordering, which can differ from run to run (and in theory even from call to call). Also this whole bit could use some comments, I\u0027m already lost here.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":185,"context_line":""},{"line_number":186,"context_line":"        def sort_key(x):"},{"line_number":187,"context_line":"            if isinstance(x, (set, list)) or isinstance(x, datetime.datetime):"},{"line_number":188,"context_line":"                return str(x)"},{"line_number":189,"context_line":"            if isinstance(x, dict):"},{"line_number":190,"context_line":"                items \u003d ((sort_key(key), sort_key(value))"},{"line_number":191,"context_line":"                         for key, value in x.items())"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_7c5cb925","line":188,"in_reply_to":"9ad45d7e_8933cb13","updated":"2016-08-19 21:08:47.000000000","message":"Yeah, sets aren\u0027t even JSON serializable. See above.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        def inner(expected, observed):"},{"line_number":196,"context_line":"            if isinstance(expected, dict) and isinstance(observed, dict):"},{"line_number":197,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":198,"context_line":"                expected_keys \u003d sorted(expected)"},{"line_number":199,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":200,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":203,"context_line":"                    inner(expected[key], observed[key])"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_855a9128","line":200,"range":{"start_line":197,"start_character":16,"end_line":200,"end_character":62},"updated":"2016-08-10 14:37:57.000000000","message":"You can just do self.assertItemsEqual instead of all of this.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":194,"context_line":""},{"line_number":195,"context_line":"        def inner(expected, observed):"},{"line_number":196,"context_line":"            if isinstance(expected, dict) and isinstance(observed, dict):"},{"line_number":197,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":198,"context_line":"                expected_keys \u003d sorted(expected)"},{"line_number":199,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":200,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":203,"context_line":"                    inner(expected[key], observed[key])"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_fc03890d","line":200,"range":{"start_line":197,"start_character":16,"end_line":200,"end_character":62},"in_reply_to":"9ad45d7e_855a9128","updated":"2016-08-19 21:08:47.000000000","message":"You\u0027re right.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"20a6f7cff960e2b15567c63837ca20eafeaca2a5","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":200,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":203,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":204,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":205,"context_line":"                  isinstance(observed, (list, tuple, set))):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_e5df0d67","line":202,"range":{"start_line":202,"start_character":27,"end_line":202,"end_character":32},"updated":"2016-08-10 14:37:57.000000000","message":"Why do you need an iterator here if you convert to list anyway?","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":200,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":203,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":204,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":205,"context_line":"                  isinstance(observed, (list, tuple, set))):"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_693817f0","line":202,"updated":"2016-08-10 14:27:01.000000000","message":"for key in expected:","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":199,"context_line":"                observed_keys \u003d sorted(observed)"},{"line_number":200,"context_line":"                self.assertEqual(expected_keys, observed_keys)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"                for key in list(six.iterkeys(expected)):"},{"line_number":203,"context_line":"                    inner(expected[key], observed[key])"},{"line_number":204,"context_line":"            elif (isinstance(expected, (list, tuple, set)) and"},{"line_number":205,"context_line":"                  isinstance(observed, (list, tuple, set))):"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_500e0135","line":202,"range":{"start_line":202,"start_character":27,"end_line":202,"end_character":32},"in_reply_to":"9ad45d7e_e5df0d67","updated":"2016-08-19 21:08:47.000000000","message":"Good points.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"c4dd8331b61db0e93fed23fc8832779cdce74fae","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"                expected_values_iter \u003d iter(sorted(expected, key\u003dsort_key))"},{"line_number":209,"context_line":"                observed_values_iter \u003d iter(sorted(observed, key\u003dsort_key))"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"                for i in range(len(expected)):"},{"line_number":212,"context_line":"                    inner(next(expected_values_iter),"}],"source_content_type":"text/x-python","patch_set":24,"id":"9ad45d7e_c93943f4","line":209,"updated":"2016-08-10 14:27:01.000000000","message":"I don\u0027t agree with sorting, and anyway it can be simpler. First, you don\u0027t need iter() call, then:\n\n for expected_item, observed_item in zip(expected_values, observed_values):\n     inner(expected_item, observed_item)","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"70c2adc7bf3a320546be74683f426bc8781876de","unresolved":false,"context_lines":[{"line_number":206,"context_line":"                self.assertEqual(len(expected), len(observed))"},{"line_number":207,"context_line":""},{"line_number":208,"context_line":"                expected_values_iter \u003d iter(sorted(expected, key\u003dsort_key))"},{"line_number":209,"context_line":"                observed_values_iter \u003d iter(sorted(observed, key\u003dsort_key))"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"                for i in range(len(expected)):"},{"line_number":212,"context_line":"                    inner(next(expected_values_iter),"}],"source_content_type":"text/x-python","patch_set":24,"id":"1ac06dbe_b0f8157e","line":209,"in_reply_to":"9ad45d7e_c93943f4","updated":"2016-08-19 21:08:47.000000000","message":"Good point. I changed the entire method. See L169.","commit_id":"22c67940b7f7eb963e9b54e905fcc537d3f539cf"}],"ironic/tests/unit/common/test_rpc.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"868081602b60181ff330138176d0dcb40057c5fa","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                         rpc.NOTIFICATION_TRANSPORT)"},{"line_number":40,"context_line":"        self.assertTrue(mock_serializer.called)"},{"line_number":41,"context_line":"        self.assertEqual(mock_notifier.return_value, rpc.METRICS_NOTIFIER)"},{"line_number":42,"context_line":"        self.assertEqual(mock_notifier.return_value, rpc.VERSIONED_NOTIFIER)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class TestRequestContextSerializer(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_c44e023a","line":42,"updated":"2016-07-21 13:28:43.000000000","message":"assertEqual should use parameters order: expected, actual_value","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"cf9667f366e90df75f8eeb05da1a1ed927c83df1","unresolved":false,"context_lines":[{"line_number":39,"context_line":"                         rpc.NOTIFICATION_TRANSPORT)"},{"line_number":40,"context_line":"        self.assertTrue(mock_serializer.called)"},{"line_number":41,"context_line":"        self.assertEqual(mock_notifier.return_value, rpc.METRICS_NOTIFIER)"},{"line_number":42,"context_line":"        self.assertEqual(mock_notifier.return_value, rpc.VERSIONED_NOTIFIER)"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class TestRequestContextSerializer(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":18,"id":"dada55a8_c801ab3b","line":42,"in_reply_to":"dada55a8_c44e023a","updated":"2016-07-22 18:12:05.000000000","message":"You\u0027re right, I thought this was unittest from the standard lib, but the base testing class uses testtools, which does specify the order:\n\nhttp://testtools.readthedocs.io/en/latest/api.html#testtools.TestCase.assertEqual\n\nFixed the old assert here, the new asserts I added, and the other notification test cases.","commit_id":"be98041c309fa6fd6d5d7b6e339c3c50d08c4ea9"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        rpc.SENSORS_NOTIFIER \u003d None"},{"line_number":35,"context_line":"        rpc.VERSIONED_NOTIFIER \u003d None"},{"line_number":36,"context_line":"        rpc.init(CONF)"},{"line_number":37,"context_line":"        self.assertEqual(rpc.TRANSPORT, mock_get_transport.return_value)"},{"line_number":38,"context_line":"        self.assertEqual(rpc.NOTIFICATION_TRANSPORT,"},{"line_number":39,"context_line":"                         mock_get_notification.return_value)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_e9c72010","line":37,"updated":"2016-07-28 22:37:20.000000000","message":"isn\u0027t it the other way around? assert expected, actual?\n\nwe expect the value to be mock_get_transport.return_value, vs the actual value from rpc.TRANSPORT.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        rpc.SENSORS_NOTIFIER \u003d None"},{"line_number":35,"context_line":"        rpc.VERSIONED_NOTIFIER \u003d None"},{"line_number":36,"context_line":"        rpc.init(CONF)"},{"line_number":37,"context_line":"        self.assertEqual(rpc.TRANSPORT, mock_get_transport.return_value)"},{"line_number":38,"context_line":"        self.assertEqual(rpc.NOTIFICATION_TRANSPORT,"},{"line_number":39,"context_line":"                         mock_get_notification.return_value)"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_981f535a","line":37,"in_reply_to":"bacf61ea_e9c72010","updated":"2016-08-01 17:55:32.000000000","message":"Yes, you\u0027re right. I think Yuriy and I were confused about what the actual value is (rpc.TRANSPORT) vs. the expected value. See patch set 18 for our discussion. I think it\u0027s a bit confusing in this case. I will change it back to the way it was.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                         rpc.NOTIFICATION_TRANSPORT)"},{"line_number":43,"context_line":"        self.assertTrue(mock_serializer.called)"},{"line_number":44,"context_line":"        self.assertEqual(rpc.SENSORS_NOTIFIER, mock_notifier.return_value)"},{"line_number":45,"context_line":"        self.assertEqual(rpc.VERSIONED_NOTIFIER, mock_notifier.return_value)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class TestRequestContextSerializer(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_29a01843","line":45,"updated":"2016-07-28 22:37:20.000000000","message":"might be good to have mock_notifier return two different values, so that rpc.SENSORS_NOTIFIER and rpc.VERSIONED_NOTIFIER have different values. Also, do mock_notifier.called_once_with() to make sure it is called with the expected arguments.\n\nAnd then, what about testing the effect of conf.notification_priority value.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":42,"context_line":"                         rpc.NOTIFICATION_TRANSPORT)"},{"line_number":43,"context_line":"        self.assertTrue(mock_serializer.called)"},{"line_number":44,"context_line":"        self.assertEqual(rpc.SENSORS_NOTIFIER, mock_notifier.return_value)"},{"line_number":45,"context_line":"        self.assertEqual(rpc.VERSIONED_NOTIFIER, mock_notifier.return_value)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class TestRequestContextSerializer(base.TestCase):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_d8fb8b77","line":45,"in_reply_to":"bacf61ea_29a01843","updated":"2016-08-01 17:55:32.000000000","message":"Agreed, done. It has to be assert_has_calls, though, since assert_called_once_with actually ensures that a particular method has only been called 1 time.\n\nhttps://docs.python.org/3/library/unittest.mock.html#unittest.mock.Mock.assert_called_once_with\n\nI separated this into a helper and created 1 test for when notifications are disabled and 1 test for when notifications are enabled.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.assertEqual(rpc.SENSORS_NOTIFIER, mock_notifier.return_value)"},{"line_number":45,"context_line":"        self.assertEqual(rpc.VERSIONED_NOTIFIER, mock_notifier.return_value)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class TestRequestContextSerializer(base.TestCase):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_89a66451","line":47,"updated":"2016-07-28 22:37:20.000000000","message":"you added two methods get_sensors_notifier() and get_versioned_notifier(). Is it worth adding unit tests for those?","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":44,"context_line":"        self.assertEqual(rpc.SENSORS_NOTIFIER, mock_notifier.return_value)"},{"line_number":45,"context_line":"        self.assertEqual(rpc.VERSIONED_NOTIFIER, mock_notifier.return_value)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"class TestRequestContextSerializer(base.TestCase):"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    def setUp(self):"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_fb8da9d3","line":47,"in_reply_to":"bacf61ea_89a66451","updated":"2016-08-01 17:55:32.000000000","message":"I think the previous version of this didn\u0027t test the method that returned a Notifier, but I will add tests for both.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"}],"ironic/tests/unit/objects/test_notification.py":[{"author":{"_account_id":20522,"name":"Aline Bousquet","email":"albousque@gmail.com","username":"alineb"},"change_message_id":"7154018f5edaab33ffc65c42ed5af1892a503eda","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertTrue(mock_notify.called)"},{"line_number":87,"context_line":"        self.assertEqual(mock_notify.call_args[0][0], mock_context)"},{"line_number":88,"context_line":"        self.assertEqual(mock_notify.call_args[1][\u0027event_type\u0027],"},{"line_number":89,"context_line":"                         expected_event_type)"},{"line_number":90,"context_line":"        actual_payload \u003d mock_notify.call_args[1][\u0027payload\u0027]"},{"line_number":91,"context_line":"        self.assertJsonEqual(expected_payload, actual_payload)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_6bcb04a6","line":89,"updated":"2016-06-23 14:45:45.000000000","message":"I think the expected value is supposed to be the first argument in tests?","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"687c6414276b7c8be0d60641e70d7558de30bbe9","unresolved":false,"context_lines":[{"line_number":86,"context_line":"        self.assertTrue(mock_notify.called)"},{"line_number":87,"context_line":"        self.assertEqual(mock_notify.call_args[0][0], mock_context)"},{"line_number":88,"context_line":"        self.assertEqual(mock_notify.call_args[1][\u0027event_type\u0027],"},{"line_number":89,"context_line":"                         expected_event_type)"},{"line_number":90,"context_line":"        actual_payload \u003d mock_notify.call_args[1][\u0027payload\u0027]"},{"line_number":91,"context_line":"        self.assertJsonEqual(expected_payload, actual_payload)"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-python","patch_set":12,"id":"3aaa91ec_9b942245","line":89,"in_reply_to":"3aaa91ec_6bcb04a6","updated":"2016-06-27 19:03:59.000000000","message":"Not sure, I don\u0027t think it matters? https://docs.python.org/2.7/library/unittest.html#unittest.TestCase.assertEqual\n\nI can change if it helps with error messages or something when these fail though.","commit_id":"8d6cfcfd31c79768ede11758693d1524d4448d61"},{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        def populate_schema(self, test_obj):"},{"line_number":48,"context_line":"            super(TestNotificationBase.TestNotificationPayload,"},{"line_number":49,"context_line":"                  self).populate_schema(test_obj\u003dtest_obj)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @base.IronicObjectRegistry.register_if(False)"},{"line_number":52,"context_line":"    class TestNotificationPayloadEmptySchema("}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_ba91c39c","line":49,"updated":"2016-06-29 07:06:53.000000000","message":"seems to be a no-op","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        def populate_schema(self, test_obj):"},{"line_number":48,"context_line":"            super(TestNotificationBase.TestNotificationPayload,"},{"line_number":49,"context_line":"                  self).populate_schema(test_obj\u003dtest_obj)"},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"    @base.IronicObjectRegistry.register_if(False)"},{"line_number":52,"context_line":"    class TestNotificationPayloadEmptySchema("}],"source_content_type":"text/x-python","patch_set":14,"id":"3aaa91ec_a8ccb9bb","line":49,"in_reply_to":"3aaa91ec_ba91c39c","updated":"2016-06-29 18:41:19.000000000","message":"Removed.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"84feef9a322374b86a3f7afe19179e7c833345e2","unresolved":false,"context_lines":[{"line_number":144,"context_line":"        self.assertFalse(mock_notifier.called)"},{"line_number":145,"context_line":""},{"line_number":146,"context_line":"    @mock.patch(\u0027ironic.common.rpc.VERSIONED_NOTIFIER\u0027)"},{"line_number":147,"context_line":"    def test_no_emit_notifs_disabled(self, mock_notifier):"},{"line_number":148,"context_line":"        # Make sure notifications aren\u0027t emitted when notification_priority"},{"line_number":149,"context_line":"        # isn\u0027t defined, indicating notifications should be disabled"},{"line_number":150,"context_line":"        payload \u003d self.TestNotificationPayload(an_extra_field\u003d\u0027extra\u0027,"}],"source_content_type":"text/x-python","patch_set":19,"id":"dada55a8_1fbe57ff","line":147,"updated":"2016-07-22 18:14:42.000000000","message":"Jay - here\u0027s the test that would validate the undefined (None) option working correctly in the config","commit_id":"69d8e451e75a04fd9357d4f5c28fe65df1fa0d4d"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from ironic.objects import notification"},{"line_number":19,"context_line":"from ironic.tests import base as test_base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestNotificationBase(test_base.TestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @base.IronicObjectRegistry.register_if(False)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_8ce1529d","line":21,"updated":"2016-07-28 22:37:20.000000000","message":"A few things that I didn\u0027t see tested:\n\nEventType.to_event_type_field(), the \u0027phase\u0027 part.\n\nNotificationPayloadBase.populate_schema()","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":18,"context_line":"from ironic.objects import notification"},{"line_number":19,"context_line":"from ironic.tests import base as test_base"},{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TestNotificationBase(test_base.TestCase):"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"    @base.IronicObjectRegistry.register_if(False)"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_07adbe87","line":21,"in_reply_to":"bacf61ea_8ce1529d","updated":"2016-08-01 17:55:32.000000000","message":"Done.\n\nThe populate_schema test actually caught a bug where we weren\u0027t catching the right exception type (oslo versionedobjects raises NotImplementedError instead of AttributeError when trying to access an attribute that doesn\u0027t exist on the object).","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        SCHEMA \u003d {"},{"line_number":37,"context_line":"            \u0027fake_field_1\u0027: (\u0027test_obj\u0027, \u0027fake_field_1\u0027),"},{"line_number":38,"context_line":"            \u0027fake_field_2\u0027: (\u0027test_obj\u0027, \u0027fake_field_2\u0027)"},{"line_number":39,"context_line":"        }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        fields \u003d {"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_6cde9e6e","line":38,"updated":"2016-07-28 22:37:20.000000000","message":"my suggestion is to avoid having the same value for the key and the field-of-the-datasource, so that when testing, we know which value came from where.","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        SCHEMA \u003d {"},{"line_number":37,"context_line":"            \u0027fake_field_1\u0027: (\u0027test_obj\u0027, \u0027fake_field_1\u0027),"},{"line_number":38,"context_line":"            \u0027fake_field_2\u0027: (\u0027test_obj\u0027, \u0027fake_field_2\u0027)"},{"line_number":39,"context_line":"        }"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"        fields \u003d {"}],"source_content_type":"text/x-python","patch_set":22,"id":"bacf61ea_8ce715ab","line":38,"in_reply_to":"bacf61ea_6cde9e6e","updated":"2016-08-01 17:55:32.000000000","message":"Done","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"}],"releasenotes/notes/add-notifications-97b6c79c18b48073.yaml":[{"author":{"_account_id":10239,"name":"Dmitry Tantsur","email":"dtantsur@protonmail.com","username":"dtantsur"},"change_message_id":"ceb9e2286a4572015008d63b50821d5516071792","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default)"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3aaa91ec_fab4eb35","line":3,"updated":"2016-06-29 07:06:53.000000000","message":"nit: please add dot to the end","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"9af383672451220863194f2b1d69dd236b0514f7","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default)"}],"source_content_type":"text/x-yaml","patch_set":14,"id":"3aaa91ec_8861fd3b","line":3,"in_reply_to":"3aaa91ec_fab4eb35","updated":"2016-06-29 18:41:19.000000000","message":"Done. Ruby wanted a reference for how to use this feature or a reference to the documentation (told me on IRC), so I added this as well.\n\n@Ruby - let me know if you\u0027d prefer a link or more concrete reference, or if this is OK.","commit_id":"e1e24e5b28deb00c1e4dbe57a6654439ffe9be92"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"d1d77974fb0e82459cbb82455f80f04050caf5d0","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). The developer"},{"line_number":4,"context_line":"    documentation has been updated with information about how to enable and use"},{"line_number":5,"context_line":"    this feature by setting the \"notification_priority\" configuration option."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"bacf61ea_52d101fb","line":5,"updated":"2016-07-27 17:10:57.000000000","message":"Instead of \u0027The developer ...\u0027, what about just pointing a pointer to the actual page., eg, \u0027For more information, see the notification documentation.\u0027","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"e813dffa4b7440c01ce04167ce3bc468d6fd6a5e","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). The developer"},{"line_number":4,"context_line":"    documentation has been updated with information about how to enable and use"},{"line_number":5,"context_line":"    this feature by setting the \"notification_priority\" configuration option."}],"source_content_type":"text/x-yaml","patch_set":20,"id":"bacf61ea_04045913","line":5,"in_reply_to":"bacf61ea_52d101fb","updated":"2016-07-27 22:25:38.000000000","message":"Done","commit_id":"30e66ba007ee758c563c1b50de87f301542d1292"},{"author":{"_account_id":6618,"name":"Ruby Loo","email":"opensrloo@gmail.com","username":"rloo"},"change_message_id":"566b269827b230efc85c0a24d880dd4180e8e498","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). For more information,"},{"line_number":4,"context_line":"    see the notifications documentation in the developer\u0027s guide."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"bacf61ea_b763c019","line":4,"updated":"2016-07-28 22:37:20.000000000","message":"the link should be http://docs.openstack.org/developer/ironic/dev/notifications.html (if you want to add that.)","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"7736ad4c92d4598f8276ddbb276855c77f183e65","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). For more information,"},{"line_number":4,"context_line":"    see the notifications documentation in the developer\u0027s guide."}],"source_content_type":"text/x-yaml","patch_set":22,"id":"bacf61ea_c70f2635","line":4,"in_reply_to":"bacf61ea_b763c019","updated":"2016-08-01 17:55:32.000000000","message":"Done","commit_id":"2483a046338d82e8cceeef001f904ca0af510b5e"},{"author":{"_account_id":14525,"name":"Vasyl Saienko","email":"vsaienko@mirantis.com","username":"vsaienko"},"change_message_id":"c60fd52c42dcd6079215e136c8b97ef2f3e1e7ca","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). For more information,"},{"line_number":4,"context_line":"    see the notifications documentation in the developer\u0027s guide"},{"line_number":5,"context_line":"    (http://docs.openstack.org/developer/ironic/dev/notifications.html)."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"1ac06dbe_75677425","line":3,"updated":"2016-08-22 10:56:29.000000000","message":"I think we need to add more details here. It is not clear from release notes what kind of notification were added intra-service/inter-service? What config option enables them etc...","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"},{"author":{"_account_id":13295,"name":"Mario Villaplana","email":"mario.villaplana@gmail.com","username":"mariojv"},"change_message_id":"11fb302ea4c759e47ac0e3a89e0be8a3257a65b1","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - Add support for notifications (disabled by default). For more information,"},{"line_number":4,"context_line":"    see the notifications documentation in the developer\u0027s guide"},{"line_number":5,"context_line":"    (http://docs.openstack.org/developer/ironic/dev/notifications.html)."}],"source_content_type":"text/x-yaml","patch_set":25,"id":"1ac06dbe_2a3bc49d","line":3,"in_reply_to":"1ac06dbe_75677425","updated":"2016-08-22 16:07:07.000000000","message":"I was actually asked by another reviewer to add less detail here and let the docs describe the change.\n\nI added the config option.\n\nI suggest we wait for https://review.openstack.org/#/c/321865/ or another patch to add more information to the release notes. Right now, there are no notifications that will be sent even if the option is enabled. However, that may change if that patch gets merged before the next release, so adding a message here to that effect could be misleading.","commit_id":"752b0487df622a6cdea80c433478726f78ad5aeb"}]}
