)]}'
{"specs/newton/approved/versioned-notification-transformation.rst":[{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":22,"context_line":"The legacy notification interface of nova is not well defined and the legacy"},{"line_number":23,"context_line":"notifications define a very inconsistent interface. There is no easy"},{"line_number":24,"context_line":"way to see from the notification consumer point of view what is the format"},{"line_number":25,"context_line":"and the content of the notification nova sends."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Cases"},{"line_number":28,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_f64bcf57","line":25,"updated":"2016-03-01 16:31:49.000000000","message":"There is no easy way for a notification consumer to see the format and content that nova will send.\n\nOr something like that. The other way is too roundabout.","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":22,"context_line":"The legacy notification interface of nova is not well defined and the legacy"},{"line_number":23,"context_line":"notifications define a very inconsistent interface. There is no easy"},{"line_number":24,"context_line":"way to see from the notification consumer point of view what is the format"},{"line_number":25,"context_line":"and the content of the notification nova sends."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Use Cases"},{"line_number":28,"context_line":"---------"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_d019b023","line":25,"in_reply_to":"7af24918_f64bcf57","updated":"2016-03-04 08:49:32.000000000","message":"Done","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.create.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There is a lot of similar notifications with compute.instance.*"},{"line_number":46,"context_line":"  event_type. All of them goes through the same code path with different extra"},{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."},{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_96d88bf1","line":46,"updated":"2016-03-01 16:31:49.000000000","message":"go","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.create.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There is a lot of similar notifications with compute.instance.*"},{"line_number":46,"context_line":"  event_type. All of them goes through the same code path with different extra"},{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."},{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_b0eb44db","line":46,"in_reply_to":"7af24918_96d88bf1","updated":"2016-03-04 08:49:32.000000000","message":"Done","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for ever"},{"line_number":53,"context_line":"  decorated functions which is unfeasible so here we have to do something"},{"line_number":54,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":55,"context_line":"  the version number."}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_56a44356","line":52,"updated":"2016-03-01 16:31:49.000000000","message":"s/ever/every/","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for ever"},{"line_number":53,"context_line":"  decorated functions which is unfeasible so here we have to do something"},{"line_number":54,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":55,"context_line":"  the version number."}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_f08dcc31","line":52,"in_reply_to":"7af24918_56a44356","updated":"2016-03-04 08:49:32.000000000","message":"Done","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for ever"},{"line_number":53,"context_line":"  decorated functions which is unfeasible so here we have to do something"},{"line_number":54,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_36bc176c","line":53,"updated":"2016-03-01 16:31:49.000000000","message":"function","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for ever"},{"line_number":53,"context_line":"  decorated functions which is unfeasible so here we have to do something"},{"line_number":54,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_907f2814","line":53,"in_reply_to":"7af24918_36bc176c","updated":"2016-03-04 08:49:32.000000000","message":"Done","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":58,"context_line":"want to create a priority order between them as well?"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_364a5784","line":58,"updated":"2016-03-01 16:31:49.000000000","message":"You might consider just the first two and make the other one a separate project or spec because the idea of \"semi-versioned-notification\" doesn\u0027t sound like a great idea. Better to have a fully versioned, but with variability within itself...","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":58,"context_line":"want to create a priority order between them as well?"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_3037344e","line":58,"in_reply_to":"7af24918_364a5784","updated":"2016-03-04 08:49:32.000000000","message":"You are right that the wrap_exception notification is quite a bit different from the first two. However this is quite a small addition. You can see now in the patch set 2.","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"2f52ebaf89307a4269d20b9437ca5ae5531f9525","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":162,"context_line":"   class ServiceStatusPayload(notification.NotificationPayloadBase):"},{"line_number":163,"context_line":"       SCHEMA \u003d {"},{"line_number":164,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":165,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_b625c7c3","line":162,"updated":"2016-03-01 16:31:49.000000000","message":"should this be an InstanceUpdatePayload?","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c04f5104d0dbf3da2f932701003507dc5bedd0ec","unresolved":false,"context_lines":[{"line_number":159,"context_line":""},{"line_number":160,"context_line":""},{"line_number":161,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":162,"context_line":"   class ServiceStatusPayload(notification.NotificationPayloadBase):"},{"line_number":163,"context_line":"       SCHEMA \u003d {"},{"line_number":164,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":165,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":1,"id":"7af24918_30f574ec","line":162,"in_reply_to":"7af24918_b625c7c3","updated":"2016-03-04 08:49:32.000000000","message":"Done","commit_id":"224ff9208e4e9caa0fe46d3c53f091ad8ba0cf46"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  terms of payload size so this will give use good feedback about the"},{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.create.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There is a lot of similar notifications with compute.instance.*"},{"line_number":46,"context_line":"  event_type. All of them go through the same code path with different extra"},{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_829e7305","line":45,"updated":"2016-03-06 20:01:42.000000000","message":"s/There is a lot of/There are/","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":42,"context_line":"  terms of payload size so this will give use good feedback about the"},{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.create.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There is a lot of similar notifications with compute.instance.*"},{"line_number":46,"context_line":"  event_type. All of them go through the same code path with different extra"},{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_7026b117","line":45,"in_reply_to":"7af24918_829e7305","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."},{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":53,"context_line":"  every decorated function which is unfeasible so here we have to do something"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_62a36750","line":50,"updated":"2016-03-06 20:01:42.000000000","message":"s/as the \u0027args\u0027 field the call args/since the \u0027args\u0027 field contains the call args/","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":47,"context_line":"  payload pieces. Also nova wants to add new notifications with similar type in"},{"line_number":48,"context_line":"  [3], [4] so creating an example will help those efforts."},{"line_number":49,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":50,"context_line":"  payload as the \u0027args\u0027 field the call args of the decorated function"},{"line_number":51,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":52,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":53,"context_line":"  every decorated function which is unfeasible so here we have to do something"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_d07d05e9","line":50,"in_reply_to":"7af24918_62a36750","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":58,"context_line":"want to create a priority order between them as well?"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_c2887bc9","line":58,"updated":"2016-03-06 20:01:42.000000000","message":"Actually, the most important notification IMHO is compute.instance.delete.end. This notification -- in the same way as identity.user.deleted -- is used by operators to trigger cleanup and billing activities when resources are freed in the system.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  the version number."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":58,"context_line":"want to create a priority order between them as well?"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_b0815992","line":58,"in_reply_to":"7af24918_c2887bc9","updated":"2016-03-07 13:24:07.000000000","message":"Thanks! This is exactly the input I\u0027m looking for. I think replacing compute.instance.create.* with compute.instance.delete.* in the plan has minimal effect on the scope but the operator can gain a lot based on your comment so I will take compute.instance.delete.* instead.\nIs the compute.instance.soft_delete.* notification also important or just the compute.instance.delete.*?","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d7af589a763cfc3d20d6d6959a08d5305df65ac1","unresolved":false,"context_lines":[{"line_number":233,"context_line":"       def __init__(self, instance):"},{"line_number":234,"context_line":"           super(InstanceCreateEndPayload, self).__init__(instance)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"Also we referring to couple of extra classes in our payloads::"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":239,"context_line":"   class BwUsage(base.NovaObject):"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_5ec76395","line":236,"updated":"2016-03-04 13:46:54.000000000","message":"Also we are referring to a couple...","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":233,"context_line":"       def __init__(self, instance):"},{"line_number":234,"context_line":"           super(InstanceCreateEndPayload, self).__init__(instance)"},{"line_number":235,"context_line":""},{"line_number":236,"context_line":"Also we referring to couple of extra classes in our payloads::"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":239,"context_line":"   class BwUsage(base.NovaObject):"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_b006791e","line":236,"in_reply_to":"7af24918_5ec76395","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":350,"context_line":""},{"line_number":351,"context_line":"       fields \u003d {"},{"line_number":352,"context_line":"           \u0027payload\u0027: fields.ObjectField(\u0027InstanceActionPayload\u0027)"},{"line_number":353,"context_line":"       }"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"This model is intended to hold the same information as the existing legacy"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_a2856fae","line":353,"updated":"2016-03-06 20:01:42.000000000","message":"I\u0027m not entirely clear what the purpose is of having a new object class for all types of notifications, all having the same single \u0027payload\u0027 field. Is this really necessary or can we just have a single Notification class that has a \u0027type\u0027 field and a \u0027payload\u0027 field?","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":350,"context_line":""},{"line_number":351,"context_line":"       fields \u003d {"},{"line_number":352,"context_line":"           \u0027payload\u0027: fields.ObjectField(\u0027InstanceActionPayload\u0027)"},{"line_number":353,"context_line":"       }"},{"line_number":354,"context_line":""},{"line_number":355,"context_line":""},{"line_number":356,"context_line":"This model is intended to hold the same information as the existing legacy"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_0b2bbc31","line":353,"in_reply_to":"7af24918_a2856fae","updated":"2016-03-07 13:24:07.000000000","message":"It is not the same single payload field as in every notification the type of the payload field is different. The version of the notification depends on the type of of the payload. When somebody want\u0027s to change the type of the payload field of a specific notification we have to make sure that this is detected by the object versioning framework as it is potentially non backward compatible change in the wire format.\nI feel the pain of the repetition but I\u0027m not sure how can we keep the versioning and having a single Notification class at the same time. But I\u0027m open for suggestions.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":357,"context_line":"notification however some changes are necessary:"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"* There are fields in the legacy notification like \u0027progress\u0027 which is either"},{"line_number":360,"context_line":"  and integer or an empty string in the notification. This behaviour cannot be"},{"line_number":361,"context_line":"  kept in the model so in the versioned notification \u0027progress\u0027 is a nullable"},{"line_number":362,"context_line":"  integer instead."},{"line_number":363,"context_line":"* In the existing notification the \u0027bandwidth\u0027 field is a dict where the keys"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_029383fb","line":360,"updated":"2016-03-06 20:01:42.000000000","message":"s/and integer/an integer/","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":357,"context_line":"notification however some changes are necessary:"},{"line_number":358,"context_line":""},{"line_number":359,"context_line":"* There are fields in the legacy notification like \u0027progress\u0027 which is either"},{"line_number":360,"context_line":"  and integer or an empty string in the notification. This behaviour cannot be"},{"line_number":361,"context_line":"  kept in the model so in the versioned notification \u0027progress\u0027 is a nullable"},{"line_number":362,"context_line":"  integer instead."},{"line_number":363,"context_line":"* In the existing notification the \u0027bandwidth\u0027 field is a dict where the keys"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_abf1e8cf","line":360,"in_reply_to":"7af24918_029383fb","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":364,"context_line":"  are network labels and the values are dicts with two key value pairs for the"},{"line_number":365,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":366,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":367,"context_line":"  bandwidths."},{"line_number":368,"context_line":"* Audit period fields was at the root level of the payload in the legacy"},{"line_number":369,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":370,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_e28f77ca","line":367,"updated":"2016-03-06 20:01:42.000000000","message":"I don\u0027t think @cdent will actually like this change. He\u0027s not a fan of lists of dicts, preferring instead to keep things as a dict, keyed from the natural key field. In this case, that would be the \u0027label\u0027 field.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"e6a987864190b12021363a92881b2041a3baaa98","unresolved":false,"context_lines":[{"line_number":364,"context_line":"  are network labels and the values are dicts with two key value pairs for the"},{"line_number":365,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":366,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":367,"context_line":"  bandwidths."},{"line_number":368,"context_line":"* Audit period fields was at the root level of the payload in the legacy"},{"line_number":369,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":370,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_94f88c7e","line":367,"in_reply_to":"5aef4532_ab4e08bf","updated":"2016-03-07 13:34:46.000000000","message":"Just to be clear the reason I don\u0027t like lists of dicts is that they are hard to select a value from in a straightforward fashion. If you have tooling that makes it easy, or you don\u0027t need to select just one thing, then it doesn\u0027t matter. The most significant place where it present trouble is when you need to choose a particular link rel from a list of links in a json response.\n\nIn a notification object I\u0027m not sure if it matters or not.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":364,"context_line":"  are network labels and the values are dicts with two key value pairs for the"},{"line_number":365,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":366,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":367,"context_line":"  bandwidths."},{"line_number":368,"context_line":"* Audit period fields was at the root level of the payload in the legacy"},{"line_number":369,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":370,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_ab4e08bf","line":367,"in_reply_to":"7af24918_e28f77ca","updated":"2016-03-07 13:24:07.000000000","message":"When I look at it from the wire format point of view then I agree that list of dict is not nice. When I look at it from o.vo modelling point if view having a list for BwUsage objects seem to be the correct model. However this model will result in a list of dict wire format. \nI don\u0027t see the way to model this with o.vo in a way that results in a single bw usage dict on the wire. But I\u0027m open for suggestions.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":380,"context_line":"to the wire. This means that changes in the actual internal structure of the"},{"line_number":381,"context_line":"exception will not cause a version change of the payload. This way we don\u0027t"},{"line_number":382,"context_line":"need to prepare a model for every possible exception but we can still include"},{"line_number":383,"context_line":"it to the wire format although this will make the payload only semi-versioned."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"nova.exception.wrap_exception"},{"line_number":386,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_42bbcb75","line":383,"updated":"2016-03-06 20:01:42.000000000","message":"Why use JsonField? If it\u0027s serialized and not versioned, just dump it into a TextField.","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":380,"context_line":"to the wire. This means that changes in the actual internal structure of the"},{"line_number":381,"context_line":"exception will not cause a version change of the payload. This way we don\u0027t"},{"line_number":382,"context_line":"need to prepare a model for every possible exception but we can still include"},{"line_number":383,"context_line":"it to the wire format although this will make the payload only semi-versioned."},{"line_number":384,"context_line":""},{"line_number":385,"context_line":"nova.exception.wrap_exception"},{"line_number":386,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_8b96ab92","line":383,"in_reply_to":"7af24918_42bbcb75","updated":"2016-03-07 13:24:07.000000000","message":"Good point. Changed it to StringField with an added explanation","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"f71c170221b189c49388d85e604f15197e356ce2","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        payload: {"},{"line_number":395,"context_line":"            exception: \u003cthe exception object\u003e"},{"line_number":396,"context_line":"            args: \u003cdict of the call args of the decorated function as gathered"},{"line_number":397,"context_line":"                   by nova.safe_utils.getcallargs expect the ones that has"},{"line_number":398,"context_line":"                   \u0027_pass\u0027 in their names\u003e"},{"line_number":399,"context_line":"        }"},{"line_number":400,"context_line":"        timestamp: ..."}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_22c03fe0","line":397,"updated":"2016-03-06 20:01:42.000000000","message":"s/expect/except/","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":394,"context_line":"        payload: {"},{"line_number":395,"context_line":"            exception: \u003cthe exception object\u003e"},{"line_number":396,"context_line":"            args: \u003cdict of the call args of the decorated function as gathered"},{"line_number":397,"context_line":"                   by nova.safe_utils.getcallargs expect the ones that has"},{"line_number":398,"context_line":"                   \u0027_pass\u0027 in their names\u003e"},{"line_number":399,"context_line":"        }"},{"line_number":400,"context_line":"        timestamp: ..."}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_ab8d677d","line":397,"in_reply_to":"7af24918_22c03fe0","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"d7af589a763cfc3d20d6d6959a08d5305df65ac1","unresolved":false,"context_lines":[{"line_number":431,"context_line":"we define a new ArgDictField takes a dict with string keys and any python"},{"line_number":432,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":433,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":434,"context_line":"the object. This fields does not have a well defined wire format so this part"},{"line_number":435,"context_line":"of the notification will not be really versioned."},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"7af24918_5e75a361","line":434,"updated":"2016-03-04 13:46:54.000000000","message":"Either \"This field does not\" or \"These fields do not\"","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7534fe08d002dc49f87d7e5b67151873769cb01c","unresolved":false,"context_lines":[{"line_number":431,"context_line":"we define a new ArgDictField takes a dict with string keys and any python"},{"line_number":432,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":433,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":434,"context_line":"the object. This fields does not have a well defined wire format so this part"},{"line_number":435,"context_line":"of the notification will not be really versioned."},{"line_number":436,"context_line":""},{"line_number":437,"context_line":""}],"source_content_type":"text/x-rst","patch_set":3,"id":"5aef4532_abe4473b","line":434,"in_reply_to":"7af24918_5e75a361","updated":"2016-03-07 13:24:07.000000000","message":"Done","commit_id":"c954d003ca7991212da692f50dd0df4b9870e208"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"e3b8ed3e52f3aa3949b9c231a9a05c8c950b9438","unresolved":false,"context_lines":[{"line_number":221,"context_line":"       }"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":225,"context_line":"   class FixedIp(base.NovaObject):"},{"line_number":226,"context_line":"       # Version 1.0: Initial version"},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027label\u0027: fields.StringField(),"},{"line_number":230,"context_line":"           \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":231,"context_line":"           \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":232,"context_line":"           \u0027type\u0027: fields.StringField(),"},{"line_number":233,"context_line":"           \u0027version\u0027: fields.IntegerField(),"},{"line_number":234,"context_line":"           \u0027address\u0027: fields.IPAddress(),"},{"line_number":235,"context_line":"           \u0027floating_ips\u0027: fields.ListOfFloatingIps()"},{"line_number":236,"context_line":"       }"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"   @base.NovaObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_822cdbac","line":236,"range":{"start_line":224,"start_character":0,"end_line":236,"end_character":8},"updated":"2016-03-28 18:27:49.000000000","message":"I think you need to be a little more explicit about what these objects are. I remember talking with alaski in M about not wanting these to be linked to the existing versioned objects, because we don\u0027t want to be pulling the rug out from anyone when we dump these on the wire, so we need to make our own set of objects for the payloads.\n\nSo these will be created new and separately for the payloads right? Or are we planning on using the existing FixedIP, FloatingIP, etc. objects?","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1c111f17fc27338c52137ce785fb71bc4c5592b6","unresolved":false,"context_lines":[{"line_number":221,"context_line":"       }"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":225,"context_line":"   class FixedIp(base.NovaObject):"},{"line_number":226,"context_line":"       # Version 1.0: Initial version"},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027label\u0027: fields.StringField(),"},{"line_number":230,"context_line":"           \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":231,"context_line":"           \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":232,"context_line":"           \u0027type\u0027: fields.StringField(),"},{"line_number":233,"context_line":"           \u0027version\u0027: fields.IntegerField(),"},{"line_number":234,"context_line":"           \u0027address\u0027: fields.IPAddress(),"},{"line_number":235,"context_line":"           \u0027floating_ips\u0027: fields.ListOfFloatingIps()"},{"line_number":236,"context_line":"       }"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"   @base.NovaObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_83314f0e","line":236,"range":{"start_line":224,"start_character":0,"end_line":236,"end_character":8},"in_reply_to":"ba0121b8_5181cf49","updated":"2016-03-29 15:20:59.000000000","message":"Hm, the only overlapping value between the nova.objects.fixed_ip.FixedIp and the FixedIp proposed here for notification is the \u0027address\u0027 so I think it does not worth to try to reuse anything. Same is true for FloatingIp.","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4507d51aebb6df19f800797f4230da14eae6afab","unresolved":false,"context_lines":[{"line_number":221,"context_line":"       }"},{"line_number":222,"context_line":""},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"   @base.NovaObjectRegistry.register"},{"line_number":225,"context_line":"   class FixedIp(base.NovaObject):"},{"line_number":226,"context_line":"       # Version 1.0: Initial version"},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027label\u0027: fields.StringField(),"},{"line_number":230,"context_line":"           \u0027vif_mac\u0027: fields.StringField(),"},{"line_number":231,"context_line":"           \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":232,"context_line":"           \u0027type\u0027: fields.StringField(),"},{"line_number":233,"context_line":"           \u0027version\u0027: fields.IntegerField(),"},{"line_number":234,"context_line":"           \u0027address\u0027: fields.IPAddress(),"},{"line_number":235,"context_line":"           \u0027floating_ips\u0027: fields.ListOfFloatingIps()"},{"line_number":236,"context_line":"       }"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":""},{"line_number":239,"context_line":"   @base.NovaObjectRegistry.register"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_5181cf49","line":236,"range":{"start_line":224,"start_character":0,"end_line":236,"end_character":8},"in_reply_to":"ba0121b8_822cdbac","updated":"2016-03-29 11:05:18.000000000","message":"This is now a separate FixedIp object for the notification payload with the notification specific content.\n\nHowever your comment let me realize that we can do a bit of reuse of the data from the existing FixedIp object through existing whitelist feature of the versioned notification. I will look into this and update the spec.","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":1779,"name":"Daniel Berrange","email":"berrange@redhat.com","username":"berrange"},"change_message_id":"dd7c49afc83f1de881fc62e44fd80fccfe7b7ee3","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"       fields \u003d {"},{"line_number":305,"context_line":"           \u0027payload\u0027: fields.ObjectField(\u0027InstanceActionPayload\u0027)"},{"line_number":306,"context_line":"       }"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"Note that the payload of the compute.instance.delete.start and"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_117e37e4","line":306,"range":{"start_line":306,"start_character":7,"end_line":306,"end_character":8},"updated":"2016-03-29 11:14:43.000000000","message":"Thinking about namespacing of objects a little. Currently every object we have is defining stuff that\u0027s private / internal to Nova.  These new notifications objects are explicitly defining objects that are part of the public notifications API.\n\nI can\u0027t help thinking it would be desirable to compoletely separate public facing object models from internal objects models, so that it is clear to developers when they define something that is consumed outside of nova, and guarantee that we don\u0027t end up accidentally exposing internal objects as part of the public notifications\n\nTo me this suggests that we should\n\n 1. use a separate directory for these objects, ie nova/notifications/objects instead of nova/objects\n 2. Ensure that NotificationBase sets OBJ_PROJECT_NAMESPACE\u003dnova-notification to move it into a separate oslo.versionedobjects namespace\n 3. Use the regular ovo object registry instea of the NovaObjectRegistry","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1c599fbbe767d9c58a44ae5ee2c98b4d74d67304","unresolved":false,"context_lines":[{"line_number":303,"context_line":""},{"line_number":304,"context_line":"       fields \u003d {"},{"line_number":305,"context_line":"           \u0027payload\u0027: fields.ObjectField(\u0027InstanceActionPayload\u0027)"},{"line_number":306,"context_line":"       }"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":""},{"line_number":309,"context_line":"Note that the payload of the compute.instance.delete.start and"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_8fee9b20","line":306,"range":{"start_line":306,"start_character":7,"end_line":306,"end_character":8},"in_reply_to":"ba0121b8_117e37e4","updated":"2016-03-29 13:31:36.000000000","message":"Totally make sense. As we are adding a lot of new object during this spec it is the good time to put them in the right place.","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"e3b8ed3e52f3aa3949b9c231a9a05c8c950b9438","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        }"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":393,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":394,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":395,"context_line":"the object. This field does not have a well defined wire format so this part"},{"line_number":396,"context_line":"of the notification will not be really versioned."},{"line_number":397,"context_line":""},{"line_number":398,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_42ada330","line":395,"range":{"start_line":393,"start_character":18,"end_line":395,"end_character":11},"updated":"2016-03-28 18:27:49.000000000","message":"I think we need to watch out about how this happens. There will be concerns with secrets if we just keep trying to find something to dump if it isn\u0027t a versioned object. If there\u0027s no standardized way of sanitizing the conversion to a json blob, we might put things like passwords/keys in the payload.","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"4507d51aebb6df19f800797f4230da14eae6afab","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        }"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":393,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":394,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":395,"context_line":"the object. This field does not have a well defined wire format so this part"},{"line_number":396,"context_line":"of the notification will not be really versioned."},{"line_number":397,"context_line":""},{"line_number":398,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_911d2712","line":395,"range":{"start_line":393,"start_character":18,"end_line":395,"end_character":11},"in_reply_to":"ba0121b8_42ada330","updated":"2016-03-29 11:05:18.000000000","message":"Yes, this is dangerous. However it is as dangerous as the existing notifications emitted by nova.exception.wrap_exception. My original intention was to migrate these notification as is, but if we worry about security then we can drop this kind of really generic notifications from the versioned notification plan and force the community to add specific / sanitized notifications for certain error cases later. \nWhat do you think?","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1c111f17fc27338c52137ce785fb71bc4c5592b6","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        }"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":393,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":394,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":395,"context_line":"the object. This field does not have a well defined wire format so this part"},{"line_number":396,"context_line":"of the notification will not be really versioned."},{"line_number":397,"context_line":""},{"line_number":398,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_e323eb03","line":395,"range":{"start_line":393,"start_character":18,"end_line":395,"end_character":11},"in_reply_to":"ba0121b8_750af4d3","updated":"2016-03-29 15:20:59.000000000","message":"There are some sanitation already in wrap_exception here https://github.com/openstack/nova/blob/master/nova/exception.py#L74 My intention, to keep this as it is, includes this sanitation as well. :)","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"a41e76a7de987b83a403a585709c1d561c82e6d0","unresolved":false,"context_lines":[{"line_number":390,"context_line":"        }"},{"line_number":391,"context_line":""},{"line_number":392,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":393,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":394,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":395,"context_line":"the object. This field does not have a well defined wire format so this part"},{"line_number":396,"context_line":"of the notification will not be really versioned."},{"line_number":397,"context_line":""},{"line_number":398,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba0121b8_750af4d3","line":395,"range":{"start_line":393,"start_character":18,"end_line":395,"end_character":11},"in_reply_to":"ba0121b8_911d2712","updated":"2016-03-29 14:01:43.000000000","message":"I have no idea what the typical payload is for something that comes through wrap_exception, but if it isn\u0027t any different than the current notifications, it appears to not be much of a problem right now, so it\u0027ll be fine to keep it this way.","commit_id":"0222597435aadddd6c9df4ed45a39b42934e0e4e"},{"author":{"_account_id":20873,"name":"Laszlo Hegedus","email":"hegedues.laszlo@gmail.com","username":"laszloh"},"change_message_id":"55e290c300ae900507dd6225ac605801b345c8b3","unresolved":false,"context_lines":[{"line_number":350,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":351,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":352,"context_line":"  bandwidths."},{"line_number":353,"context_line":"* Audit period fields was at the root level of the payload in the legacy"},{"line_number":354,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":355,"context_line":"* The actual exception held in the exception field of the Fault object will be"},{"line_number":356,"context_line":"  blindly serialized and stored as a string. This means that changes in the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba0121b8_58a12e93","line":353,"range":{"start_line":353,"start_character":22,"end_line":353,"end_character":25},"updated":"2016-04-04 09:06:15.000000000","message":"were","commit_id":"95bb74e3b6904246aeee456a80c428752db112e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dac18bab9fade44bea5ddac90263ff6e7a1c8ba3","unresolved":false,"context_lines":[{"line_number":350,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":351,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":352,"context_line":"  bandwidths."},{"line_number":353,"context_line":"* Audit period fields was at the root level of the payload in the legacy"},{"line_number":354,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":355,"context_line":"* The actual exception held in the exception field of the Fault object will be"},{"line_number":356,"context_line":"  blindly serialized and stored as a string. This means that changes in the"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a061dce_8e9e06b7","line":353,"range":{"start_line":353,"start_character":22,"end_line":353,"end_character":25},"in_reply_to":"ba0121b8_58a12e93","updated":"2016-04-07 11:30:31.000000000","message":"Done","commit_id":"95bb74e3b6904246aeee456a80c428752db112e1"},{"author":{"_account_id":20873,"name":"Laszlo Hegedus","email":"hegedues.laszlo@gmail.com","username":"laszloh"},"change_message_id":"55e290c300ae900507dd6225ac605801b345c8b3","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            \u0027payload\u0027: fields.ObjectField(\u0027ExceptionPayload\u0027)"},{"line_number":418,"context_line":"        }"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":421,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":422,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":423,"context_line":"the object. This field does not have a well defined wire format so this part"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a061dce_e0af9892","line":420,"range":{"start_line":420,"start_character":28,"end_line":420,"end_character":29},"updated":"2016-04-04 09:06:15.000000000","message":"that/which","commit_id":"95bb74e3b6904246aeee456a80c428752db112e1"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"dac18bab9fade44bea5ddac90263ff6e7a1c8ba3","unresolved":false,"context_lines":[{"line_number":417,"context_line":"            \u0027payload\u0027: fields.ObjectField(\u0027ExceptionPayload\u0027)"},{"line_number":418,"context_line":"        }"},{"line_number":419,"context_line":""},{"line_number":420,"context_line":"We define a new ArgDictField takes a dict with string keys and any python"},{"line_number":421,"context_line":"object as values. It uses object serialisation on the values when available,"},{"line_number":422,"context_line":"otherwise, a primitive-\u003ejson conversion, but if that fails, it just stringifies"},{"line_number":423,"context_line":"the object. This field does not have a well defined wire format so this part"}],"source_content_type":"text/x-rst","patch_set":5,"id":"9a061dce_4ee7ce3f","line":420,"range":{"start_line":420,"start_character":28,"end_line":420,"end_character":29},"in_reply_to":"9a061dce_e0af9892","updated":"2016-04-07 11:30:31.000000000","message":"Done","commit_id":"95bb74e3b6904246aeee456a80c428752db112e1"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"c0eeaf2aecb9cc46ac161d4070af9a4e92714d65","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":56,"context_line":"  every decorated function which is unfeasible so here we have to do something"},{"line_number":57,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":58,"context_line":"  the version number."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":61,"context_line":"want to create a priority order between them as well?"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_7d417ea8","line":58,"updated":"2016-04-29 14:10:31.000000000","message":"Good consideration! This is just a \"blob\" so it can\u0027t be versioned","commit_id":"93757ad27d55425cd20ff7b9bddba963edf08b50"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"c0eeaf2aecb9cc46ac161d4070af9a4e92714d65","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":209,"context_line":"       fields \u003d {"},{"line_number":210,"context_line":"           \u0027state_update\u0027: fields.ObjectField(\u0027InstanceStateUpdate\u0027),"},{"line_number":211,"context_line":"           \u0027audit_period\u0027: fields.ObjectField(\u0027AuditPeriod\u0027),"},{"line_number":212,"context_line":"           \u0027bandwidth\u0027: fields.ListOfBwUsages(),"},{"line_number":213,"context_line":"           \u0027old_display_name\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_fdef4e84","line":210,"updated":"2016-04-29 14:10:31.000000000","message":"Actually this is what I\u0027m wondering about. If we\u0027re in a different registry/namespace, can we not see InstanceStateUpdate? Or is this an object that we\u0027re remaking in our registry?\n\nAnd I guess another thing we need to consider here is, if we bump the version of InstanceStateUpdate, do we need to update the version of this payload too, because now the contract changed? Does that mean we can only use primitives in here?","commit_id":"93757ad27d55425cd20ff7b9bddba963edf08b50"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"db3c4c2c0e5e3c6f9af3466002323cca2f658204","unresolved":false,"context_lines":[{"line_number":207,"context_line":""},{"line_number":208,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":209,"context_line":"       fields \u003d {"},{"line_number":210,"context_line":"           \u0027state_update\u0027: fields.ObjectField(\u0027InstanceStateUpdate\u0027),"},{"line_number":211,"context_line":"           \u0027audit_period\u0027: fields.ObjectField(\u0027AuditPeriod\u0027),"},{"line_number":212,"context_line":"           \u0027bandwidth\u0027: fields.ListOfBwUsages(),"},{"line_number":213,"context_line":"           \u0027old_display_name\u0027: fields.StringField(nullable\u003dTrue)"}],"source_content_type":"text/x-rst","patch_set":6,"id":"1a122d0e_6a41b1a8","line":210,"in_reply_to":"1a122d0e_fdef4e84","updated":"2016-04-29 15:21:29.000000000","message":"InstanceStateUpdate needs to be recreated for notification purposes and use SCHEMA to copy the content. This way we can decide if we want to change the notification payload when the internal InstanceStateUpdate is bumped. I clarify it in the next patch set.","commit_id":"93757ad27d55425cd20ff7b9bddba963edf08b50"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"84affb42883b26381ac8a6233bbb832a63ec520c","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"The following InstancePayload class holds the common part::"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"   @ovo_base.VersionedObjectRegistry.register"},{"line_number":112,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":113,"context_line":"       SCHEMA \u003d {"},{"line_number":114,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_aaf0e991","line":111,"updated":"2016-04-29 15:15:32.000000000","message":"We will now be using register_if(False) so we don\u0027t jump into Nova\u0027s existing object space. What we\u0027ll need to do then is add testing so that we take the unregistered objects, pull all of the notifications, and check the hashes on them to maintain versioning.","commit_id":"fb291753d2053d68483e8cc8a1f3353af5e6b2fc"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1f95bec33d66bb9d288a992a8840127179cc3519","unresolved":false,"context_lines":[{"line_number":108,"context_line":""},{"line_number":109,"context_line":"The following InstancePayload class holds the common part::"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"   @ovo_base.VersionedObjectRegistry.register"},{"line_number":112,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":113,"context_line":"       SCHEMA \u003d {"},{"line_number":114,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"}],"source_content_type":"text/x-rst","patch_set":7,"id":"1a122d0e_303e08b8","line":111,"in_reply_to":"1a122d0e_aaf0e991","updated":"2016-04-29 15:46:26.000000000","message":"Right, I fix this up.","commit_id":"fb291753d2053d68483e8cc8a1f3353af5e6b2fc"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":39,"context_line":"notifications in the nova code base:"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* compute.instance.update is the biggest notification we have in nova in"},{"line_number":42,"context_line":"  terms of payload size so this will give use good feedback about the"},{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.delete.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There are similar notifications with compute.instance.*"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_be902244","line":42,"updated":"2016-04-29 19:42:33.000000000","message":"s/use/us/","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"notifications in the nova code base:"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":"* compute.instance.update is the biggest notification we have in nova in"},{"line_number":42,"context_line":"  terms of payload size so this will give use good feedback about the"},{"line_number":43,"context_line":"  usefulness of the new versioned notification infrastructure"},{"line_number":44,"context_line":"* compute.instance.delete.* is one instance of a common notification pattern in"},{"line_number":45,"context_line":"  nova. There are similar notifications with compute.instance.*"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_f938f4ef","line":42,"in_reply_to":"1a122d0e_be902244","updated":"2016-04-29 20:41:56.000000000","message":"Done","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  the version number."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":61,"context_line":"want to create a priority order between them as well?"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"During the transformation we will define an object model for these"},{"line_number":64,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_9e93a64e","line":61,"updated":"2016-04-29 19:42:33.000000000","message":"Yes, I believe the above are the most important. I think the priority you list above is cool.","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":58,"context_line":"  the version number."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"Question: Do we agree that these are the most important notifications, do we"},{"line_number":61,"context_line":"want to create a priority order between them as well?"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"During the transformation we will define an object model for these"},{"line_number":64,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_192210b9","line":61,"in_reply_to":"1a122d0e_9e93a64e","updated":"2016-04-29 20:41:56.000000000","message":"OK, I remove the question then. :)","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":78,"context_line":"Separate namespace for notification objects"},{"line_number":79,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Currently every object we have is private / internal to Nova.The object model"},{"line_number":82,"context_line":"defined for notification payloads is part of the Nova public interface."},{"line_number":83,"context_line":"Therefore the notification model needs to be separated from the existing object"},{"line_number":84,"context_line":"model, so that it is clear to developers when they define something that is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_fe961a3c","line":81,"updated":"2016-04-29 19:42:33.000000000","message":"s/Nova.The/Nova. The/","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":78,"context_line":"Separate namespace for notification objects"},{"line_number":79,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":80,"context_line":""},{"line_number":81,"context_line":"Currently every object we have is private / internal to Nova.The object model"},{"line_number":82,"context_line":"defined for notification payloads is part of the Nova public interface."},{"line_number":83,"context_line":"Therefore the notification model needs to be separated from the existing object"},{"line_number":84,"context_line":"model, so that it is clear to developers when they define something that is"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_991c6078","line":81,"in_reply_to":"1a122d0e_fe961a3c","updated":"2016-04-29 20:41:56.000000000","message":"Done","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":85,"context_line":"consumed outside of nova, and guarantee that we don\u0027t end up accidentally"},{"line_number":86,"context_line":"exposing internal objects as part of the public notifications."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"To achieve the necessary separation we will::"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* Move the already created notification related objects to a separate directory"},{"line_number":91,"context_line":"  under nova/notifications/objects/ and we will add the newly"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_de999e6e","line":88,"updated":"2016-04-29 19:42:33.000000000","message":"s/::/:/","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":85,"context_line":"consumed outside of nova, and guarantee that we don\u0027t end up accidentally"},{"line_number":86,"context_line":"exposing internal objects as part of the public notifications."},{"line_number":87,"context_line":""},{"line_number":88,"context_line":"To achieve the necessary separation we will::"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"* Move the already created notification related objects to a separate directory"},{"line_number":91,"context_line":"  under nova/notifications/objects/ and we will add the newly"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_d9125860","line":88,"in_reply_to":"1a122d0e_de999e6e","updated":"2016-04-29 20:41:56.000000000","message":"Done","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":96,"context_line":"* Keep using the NovaObject as a base class for the notification objects to"},{"line_number":97,"context_line":"  keep the wire format but do not register notification object to the"},{"line_number":98,"context_line":"  NovaObjectRegistry to avoid mixing nova internal objects with the"},{"line_number":99,"context_line":"  notification objects."},{"line_number":100,"context_line":"* Separate the unit tests so that we can test the unregistered object hashes to"},{"line_number":101,"context_line":"  maintain versioning."},{"line_number":102,"context_line":""}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_3ea532a1","line":99,"updated":"2016-04-29 19:42:33.000000000","message":"++","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":235,"context_line":"       def __init__(self, instance):"},{"line_number":236,"context_line":"           super(InstanceActionPayload, self).__init__(instance)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"Also we referring to a couple of extra classes in our payloads::"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":241,"context_line":"   class BwUsage(base.NovaObject):"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_1ea0368f","line":238,"updated":"2016-04-29 19:42:33.000000000","message":"s/we referring/we refer/","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":235,"context_line":"       def __init__(self, instance):"},{"line_number":236,"context_line":"           super(InstanceActionPayload, self).__init__(instance)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"Also we referring to a couple of extra classes in our payloads::"},{"line_number":239,"context_line":""},{"line_number":240,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":241,"context_line":"   class BwUsage(base.NovaObject):"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_3415533f","line":238,"in_reply_to":"1a122d0e_1ea0368f","updated":"2016-04-29 20:41:56.000000000","message":"Done","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"cd7acd5d50ad801f53f072a8910bf7944b7300b8","unresolved":false,"context_lines":[{"line_number":353,"context_line":"  are network labels and the values are dicts with two key value pairs for the"},{"line_number":354,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":355,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":356,"context_line":"  bandwidths."},{"line_number":357,"context_line":"* Audit period fields were at the root level of the payload in the legacy"},{"line_number":358,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":359,"context_line":"* The actual exception held in the exception field of the Fault object will be"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_7eab2a75","line":356,"updated":"2016-04-29 19:42:33.000000000","message":"If you\u0027re going to change the notification payload for the bandwidth stuff, why not make it a ListOfObjectsField(Bandwidth) with Bandwidth object defined as an object with three attributes: name, in_bytes, and out_bytes?","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5e5854ddb83c414cbd9062b764bff9d341acea5c","unresolved":false,"context_lines":[{"line_number":353,"context_line":"  are network labels and the values are dicts with two key value pairs for the"},{"line_number":354,"context_line":"  in and out bandwidth. The new model simplifies this to a list of dict where"},{"line_number":355,"context_line":"  every dict has three key value pairs one for the label and two for the"},{"line_number":356,"context_line":"  bandwidths."},{"line_number":357,"context_line":"* Audit period fields were at the root level of the payload in the legacy"},{"line_number":358,"context_line":"  instance.update notification now it is moved to a sub object."},{"line_number":359,"context_line":"* The actual exception held in the exception field of the Fault object will be"}],"source_content_type":"text/x-rst","patch_set":9,"id":"1a122d0e_f4a2bbfa","line":356,"in_reply_to":"1a122d0e_7eab2a75","updated":"2016-04-29 20:41:56.000000000","message":"Good point. I\u0027ll change it. I will do the same with FixedIp and FloatingIp too.","commit_id":"3527ea67429c758e2b4149378b00a4e8971f4e6c"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bbb00f7bc67661679062de272d64e7d74bd93733","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  Also nova wants to add new notifications with similar type in"},{"line_number":51,"context_line":"  [3], [4] so creating an example will help those efforts as well."},{"line_number":52,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":53,"context_line":"  payload since the \u0027args\u0027 field the call args of the decorated function"},{"line_number":54,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":55,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":56,"context_line":"  every decorated function which is unfeasible so here we have to do something"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_bd77633a","line":53,"updated":"2016-05-02 17:41:37.000000000","message":"there\u0027s a word or two missing from this sentence?","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9df0cc83a5b230e888ab9c58274b27218dc03ff9","unresolved":false,"context_lines":[{"line_number":50,"context_line":"  Also nova wants to add new notifications with similar type in"},{"line_number":51,"context_line":"  [3], [4] so creating an example will help those efforts as well."},{"line_number":52,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":53,"context_line":"  payload since the \u0027args\u0027 field the call args of the decorated function"},{"line_number":54,"context_line":"  gathered by nova.safe_utils.getcallargs. So here we cannot formulate a fully"},{"line_number":55,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":56,"context_line":"  every decorated function which is unfeasible so here we have to do something"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_376195d4","line":53,"in_reply_to":"1a122d0e_bd77633a","updated":"2016-05-05 16:15:38.000000000","message":"Done","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bbb00f7bc67661679062de272d64e7d74bd93733","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":56,"context_line":"  every decorated function which is unfeasible so here we have to do something"},{"line_number":57,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":58,"context_line":"  the version number."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_fdbf1ba8","line":58,"updated":"2016-05-02 17:41:37.000000000","message":"This doesn\u0027t quite make sense. I think you mean that the value of \u0027args\u0027 field is not part of the versioned format?","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9df0cc83a5b230e888ab9c58274b27218dc03ff9","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  versioned notification as that would require separate payload object for"},{"line_number":56,"context_line":"  every decorated function which is unfeasible so here we have to do something"},{"line_number":57,"context_line":"  called a semi-versioned notification where the \u0027args\u0027 field is not part of"},{"line_number":58,"context_line":"  the version number."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_977fc965","line":58,"in_reply_to":"1a122d0e_fdbf1ba8","updated":"2016-05-05 16:15:38.000000000","message":"Done","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bbb00f7bc67661679062de272d64e7d74bd93733","unresolved":false,"context_lines":[{"line_number":85,"context_line":"To achieve the necessary separation we will:"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"* Move the already created notification related objects to a separate directory"},{"line_number":88,"context_line":"  under nova/notifications/objects/ and we will add the newly"},{"line_number":89,"context_line":"  proposed object there as well."},{"line_number":90,"context_line":"* The NotificationBase and NotificationPayloadBase will set"},{"line_number":91,"context_line":"  OBJ_PROJECT_NAMESPACE to \u0027nova-notification\u0027 so all the notification related"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_1ddad717","line":88,"updated":"2016-05-02 17:41:37.000000000","message":"s/we will//","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9df0cc83a5b230e888ab9c58274b27218dc03ff9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"To achieve the necessary separation we will:"},{"line_number":86,"context_line":""},{"line_number":87,"context_line":"* Move the already created notification related objects to a separate directory"},{"line_number":88,"context_line":"  under nova/notifications/objects/ and we will add the newly"},{"line_number":89,"context_line":"  proposed object there as well."},{"line_number":90,"context_line":"* The NotificationBase and NotificationPayloadBase will set"},{"line_number":91,"context_line":"  OBJ_PROJECT_NAMESPACE to \u0027nova-notification\u0027 so all the notification related"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_f7db9d7b","line":88,"in_reply_to":"1a122d0e_1ddad717","updated":"2016-05-05 16:15:38.000000000","message":"Done","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":11564,"name":"Chris Dent","email":"cdent@anticdent.org","username":"chdent"},"change_message_id":"bbb00f7bc67661679062de272d64e7d74bd93733","unresolved":false,"context_lines":[{"line_number":441,"context_line":"The transformed notifications will have a new versioned notification format"},{"line_number":442,"context_line":"emitted if the existing \u0027notification_format\u0027 config option is set to \u0027both\u0027 or"},{"line_number":443,"context_line":"\u0027versioned\u0027. If the config is set to \u0027unversioned\u0027 or \u0027both\u0027 then the legacy"},{"line_number":444,"context_line":"notification will be emitted unchanged."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"Other end user impact"},{"line_number":447,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_9de6e7ae","line":444,"updated":"2016-05-02 17:41:37.000000000","message":"I think we\u0027ve discussed this elsewhere but I\u0027ve forgotten. If \u0027both\u0027 is set, are both notifications sent on the same topic? What does a consumer do to choose to only seen one?","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"9df0cc83a5b230e888ab9c58274b27218dc03ff9","unresolved":false,"context_lines":[{"line_number":441,"context_line":"The transformed notifications will have a new versioned notification format"},{"line_number":442,"context_line":"emitted if the existing \u0027notification_format\u0027 config option is set to \u0027both\u0027 or"},{"line_number":443,"context_line":"\u0027versioned\u0027. If the config is set to \u0027unversioned\u0027 or \u0027both\u0027 then the legacy"},{"line_number":444,"context_line":"notification will be emitted unchanged."},{"line_number":445,"context_line":""},{"line_number":446,"context_line":"Other end user impact"},{"line_number":447,"context_line":"---------------------"}],"source_content_type":"text/x-rst","patch_set":10,"id":"1a122d0e_d7778139","line":444,"in_reply_to":"1a122d0e_9de6e7ae","updated":"2016-05-05 16:15:38.000000000","message":"The versioned notifications are always emitted on the \u0027versioned_notifications\u0027 amqp topic. See https://github.com/openstack/nova/blob/master/nova/rpc.py#L87","commit_id":"0c0ed324638eb167e871f2fab03679212814606d"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"f7688cf0883cf7bb709508df6501b50263412d7a","unresolved":false,"context_lines":[{"line_number":235,"context_line":"Also we refer to a couple of extra classes in our payloads::"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":238,"context_line":"   class Bandwidth(base.NovaObject):"},{"line_number":239,"context_line":"       # Version 1.0: Initial version"},{"line_number":240,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":241,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_1afe0bae","line":238,"range":{"start_line":238,"start_character":9,"end_line":238,"end_character":18},"updated":"2016-05-04 15:16:09.000000000","message":"same here as below","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7423aa7fdddd651904c0a67ecf4f4c9824fb8341","unresolved":false,"context_lines":[{"line_number":235,"context_line":"Also we refer to a couple of extra classes in our payloads::"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":238,"context_line":"   class Bandwidth(base.NovaObject):"},{"line_number":239,"context_line":"       # Version 1.0: Initial version"},{"line_number":240,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":241,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_459708eb","line":238,"range":{"start_line":238,"start_character":9,"end_line":238,"end_character":18},"in_reply_to":"1a122d0e_1afe0bae","updated":"2016-05-04 15:39:20.000000000","message":"Done","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"f7688cf0883cf7bb709508df6501b50263412d7a","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":249,"context_line":"   class FixedIp(base.NovaObject):"},{"line_number":250,"context_line":"       # Version 1.0: Initial version"},{"line_number":251,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":252,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_9a117b07","line":249,"range":{"start_line":249,"start_character":9,"end_line":249,"end_character":16},"updated":"2016-05-04 15:16:09.000000000","message":"These can\u0027t share the name of the existing object or else testing is going to blow up. It\u0027s also kind of bad practice because we may then get some bad side effects going on.","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7423aa7fdddd651904c0a67ecf4f4c9824fb8341","unresolved":false,"context_lines":[{"line_number":246,"context_line":""},{"line_number":247,"context_line":""},{"line_number":248,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":249,"context_line":"   class FixedIp(base.NovaObject):"},{"line_number":250,"context_line":"       # Version 1.0: Initial version"},{"line_number":251,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":252,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_e588d4c8","line":249,"range":{"start_line":249,"start_character":9,"end_line":249,"end_character":16},"in_reply_to":"1a122d0e_9a117b07","updated":"2016-05-04 15:39:20.000000000","message":"Done","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"f7688cf0883cf7bb709508df6501b50263412d7a","unresolved":false,"context_lines":[{"line_number":261,"context_line":""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":264,"context_line":"   class FloatingIp(base.NovaObject):"},{"line_number":265,"context_line":"       # Version 1.0: Initial version"},{"line_number":266,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":267,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_3a1ae717","line":264,"range":{"start_line":264,"start_character":9,"end_line":264,"end_character":19},"updated":"2016-05-04 15:16:09.000000000","message":"same here","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7423aa7fdddd651904c0a67ecf4f4c9824fb8341","unresolved":false,"context_lines":[{"line_number":261,"context_line":""},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":264,"context_line":"   class FloatingIp(base.NovaObject):"},{"line_number":265,"context_line":"       # Version 1.0: Initial version"},{"line_number":266,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":267,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_c58318a8","line":264,"range":{"start_line":264,"start_character":9,"end_line":264,"end_character":19},"in_reply_to":"1a122d0e_3a1ae717","updated":"2016-05-04 15:39:20.000000000","message":"Done","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"f7688cf0883cf7bb709508df6501b50263412d7a","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":276,"context_line":"   class AuditPeriod(base.NovaObject):"},{"line_number":277,"context_line":"       # Version 1.0: Initial version"},{"line_number":278,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":279,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_3ac82774","line":276,"range":{"start_line":276,"start_character":9,"end_line":276,"end_character":20},"updated":"2016-05-04 15:16:09.000000000","message":"same here? I\u0027m not sure if this is an existing object.","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7423aa7fdddd651904c0a67ecf4f4c9824fb8341","unresolved":false,"context_lines":[{"line_number":273,"context_line":""},{"line_number":274,"context_line":""},{"line_number":275,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":276,"context_line":"   class AuditPeriod(base.NovaObject):"},{"line_number":277,"context_line":"       # Version 1.0: Initial version"},{"line_number":278,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":279,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_65bb2476","line":276,"range":{"start_line":276,"start_character":9,"end_line":276,"end_character":20},"in_reply_to":"1a122d0e_3ac82774","updated":"2016-05-04 15:39:20.000000000","message":"Done","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":11803,"name":"Ryan Rossiter","email":"rlrossit@us.ibm.com","username":"rlrossiter"},"change_message_id":"f7688cf0883cf7bb709508df6501b50263412d7a","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":286,"context_line":"   class InstanceStateUpdate(base.NovaObject):"},{"line_number":287,"context_line":"       # Version 1.0: Initial version"},{"line_number":288,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":289,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_9aadfb9d","line":286,"range":{"start_line":286,"start_character":9,"end_line":286,"end_character":28},"updated":"2016-05-04 15:16:09.000000000","message":"same","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"7423aa7fdddd651904c0a67ecf4f4c9824fb8341","unresolved":false,"context_lines":[{"line_number":283,"context_line":""},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":286,"context_line":"   class InstanceStateUpdate(base.NovaObject):"},{"line_number":287,"context_line":"       # Version 1.0: Initial version"},{"line_number":288,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":289,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":11,"id":"1a122d0e_a5b53c7f","line":286,"range":{"start_line":286,"start_character":9,"end_line":286,"end_character":28},"in_reply_to":"1a122d0e_9aadfb9d","updated":"2016-05-04 15:39:20.000000000","message":"Done","commit_id":"b5ffa5eaeb497eb30091154ff0f786ae429efef0"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":48,"context_line":"  identity.user.deleted -- is used by operators to trigger cleanup and billing"},{"line_number":49,"context_line":"  activities when resources are freed in the system. Therefore it is important."},{"line_number":50,"context_line":"  Also nova wants to add new notifications with similar type in"},{"line_number":51,"context_line":"  [3], [4] so creating an example will help those efforts as well."},{"line_number":52,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":53,"context_line":"  payload. The \u0027args\u0027 field of the notification is filled with the  call args"},{"line_number":54,"context_line":"  of the decorated function gathered by nova.safe_utils.getcallargs."}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_b4ff0765","line":51,"updated":"2016-05-05 11:16:18.000000000","message":"We discussed ideas around a generic instance action payload. Maybe lets mention those here.\n\nNote the pattern of action.start, action.end and action.error. I guess we have this already, in some ways.\n\nI think action.error will need to use a similar format to the exception, maybe a shared object to describe an exception?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":48,"context_line":"  identity.user.deleted -- is used by operators to trigger cleanup and billing"},{"line_number":49,"context_line":"  activities when resources are freed in the system. Therefore it is important."},{"line_number":50,"context_line":"  Also nova wants to add new notifications with similar type in"},{"line_number":51,"context_line":"  [3], [4] so creating an example will help those efforts as well."},{"line_number":52,"context_line":"* nova.exceptions.wrap_exception decorator emits a notification with variable"},{"line_number":53,"context_line":"  payload. The \u0027args\u0027 field of the notification is filled with the  call args"},{"line_number":54,"context_line":"  of the decorated function gathered by nova.safe_utils.getcallargs."}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_29db90ee","line":51,"in_reply_to":"1a122d0e_b4ff0765","updated":"2016-05-05 16:15:07.000000000","message":"Done. \nThe action.error fault field is reusing the same class now than the wrap_exception one.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  So here we cannot formulate a fully versioned notification as that would"},{"line_number":56,"context_line":"  require separate payload object for every decorated function which is"},{"line_number":57,"context_line":"  unfeasible so here we have to do something called a semi-versioned"},{"line_number":58,"context_line":"  notification where the \u0027args\u0027 field is not part of the versioned format."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_72cc5f35","line":58,"updated":"2016-05-05 11:16:18.000000000","message":"I think we can do better... see below.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  So here we cannot formulate a fully versioned notification as that would"},{"line_number":56,"context_line":"  require separate payload object for every decorated function which is"},{"line_number":57,"context_line":"  unfeasible so here we have to do something called a semi-versioned"},{"line_number":58,"context_line":"  notification where the \u0027args\u0027 field is not part of the versioned format."},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"During the transformation we will define an object model for these"},{"line_number":61,"context_line":"notifications, see the Data model impact section for details. The new"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_49deccda","line":58,"in_reply_to":"1a122d0e_72cc5f35","updated":"2016-05-05 16:15:07.000000000","message":"I removed the args field from the payload, see below for reasoning.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":89,"context_line":"  proposed object there as well."},{"line_number":90,"context_line":"* The NotificationBase and NotificationPayloadBase will set"},{"line_number":91,"context_line":"  OBJ_PROJECT_NAMESPACE to \u0027nova-notification\u0027 so all the notification related"},{"line_number":92,"context_line":"  objects will belong to a separate ovo namespace."},{"line_number":93,"context_line":"* Keep using the NovaObject as a base class for the notification objects to"},{"line_number":94,"context_line":"  keep the wire format but do not register notification object to the"},{"line_number":95,"context_line":"  NovaObjectRegistry to avoid mixing nova internal objects with the"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_d4956332","line":92,"updated":"2016-05-05 11:16:18.000000000","message":"did we decide not to do that at the summit? as it breaks the current versioned notification we have","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":89,"context_line":"  proposed object there as well."},{"line_number":90,"context_line":"* The NotificationBase and NotificationPayloadBase will set"},{"line_number":91,"context_line":"  OBJ_PROJECT_NAMESPACE to \u0027nova-notification\u0027 so all the notification related"},{"line_number":92,"context_line":"  objects will belong to a separate ovo namespace."},{"line_number":93,"context_line":"* Keep using the NovaObject as a base class for the notification objects to"},{"line_number":94,"context_line":"  keep the wire format but do not register notification object to the"},{"line_number":95,"context_line":"  NovaObjectRegistry to avoid mixing nova internal objects with the"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_746870bb","line":92,"in_reply_to":"1a122d0e_88dd8c16","updated":"2016-05-06 10:15:41.000000000","message":"ah, sweet.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":89,"context_line":"  proposed object there as well."},{"line_number":90,"context_line":"* The NotificationBase and NotificationPayloadBase will set"},{"line_number":91,"context_line":"  OBJ_PROJECT_NAMESPACE to \u0027nova-notification\u0027 so all the notification related"},{"line_number":92,"context_line":"  objects will belong to a separate ovo namespace."},{"line_number":93,"context_line":"* Keep using the NovaObject as a base class for the notification objects to"},{"line_number":94,"context_line":"  keep the wire format but do not register notification object to the"},{"line_number":95,"context_line":"  NovaObjectRegistry to avoid mixing nova internal objects with the"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_88dd8c16","line":92,"in_reply_to":"1a122d0e_d4956332","updated":"2016-05-05 16:15:07.000000000","message":"OBJ_PROJECT_NAMESPACE does not break the wire format, the OBJ_SERIAL_NAMESPACE does break it. See the sample change in the PoC commit https://review.openstack.org/#/c/309454/2/doc/notification_samples/service-update.json\nThe name of the keys are changed due to the changed OBJ_SERIAL_NAMESPACE so we don\u0027t want to do that, the OBJ_PROJECT_NAMESPACE only affects the value of nova_object.namespace so it does not break the wire format. I have no hard opinion about changing the OBJ_PROJECT_NAMESPACE or not.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":108,"context_line":"The following InstancePayload class holds the common part::"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":111,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":112,"context_line":"       SCHEMA \u003d {"},{"line_number":113,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":114,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_92181b86","line":111,"range":{"start_line":111,"start_character":9,"end_line":111,"end_character":17},"updated":"2016-05-05 11:16:18.000000000","message":"Given this is called Server in our REST API, should we do the same for notifications?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":108,"context_line":"The following InstancePayload class holds the common part::"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":111,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":112,"context_line":"       SCHEMA \u003d {"},{"line_number":113,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":114,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_4413535c","line":111,"range":{"start_line":111,"start_character":9,"end_line":111,"end_character":17},"in_reply_to":"1a122d0e_92181b86","updated":"2016-05-05 16:15:07.000000000","message":"Done","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":110,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":111,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":112,"context_line":"       SCHEMA \u003d {"},{"line_number":113,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":114,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"},{"line_number":115,"context_line":"           \u0027tenant_id\u0027: (\u0027instance\u0027, \u0027project_id\u0027),"},{"line_number":116,"context_line":"           \u0027reservation_id\u0027: (\u0027instance\u0027, \u0027reservation_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_f2098f32","line":113,"range":{"start_line":113,"start_character":12,"end_line":113,"end_character":23},"updated":"2016-05-05 11:16:18.000000000","message":"can\u0027t we call this uuid instead of id?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":110,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":111,"context_line":"   class InstancePayload(notification.NotificationPayloadBase):"},{"line_number":112,"context_line":"       SCHEMA \u003d {"},{"line_number":113,"context_line":"           \u0027instance_id\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":114,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"},{"line_number":115,"context_line":"           \u0027tenant_id\u0027: (\u0027instance\u0027, \u0027project_id\u0027),"},{"line_number":116,"context_line":"           \u0027reservation_id\u0027: (\u0027instance\u0027, \u0027reservation_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_2410d74d","line":113,"range":{"start_line":113,"start_character":12,"end_line":113,"end_character":23},"in_reply_to":"1a122d0e_f2098f32","updated":"2016-05-05 16:15:07.000000000","message":"Done","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":188,"context_line":"           \u0027old_task_state\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":189,"context_line":"           \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"           \u0027access_ip_v4\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":192,"context_line":"           \u0027access_ip_v6\u0027: fields.IPV6AddressField(nullable\u003dTrue),"},{"line_number":193,"context_line":"           \u0027fixed_ips\u0027: fields.ListOfObjectsField(\u0027FixedIpPayload\u0027),"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"           \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":196,"context_line":"       }"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_77529114","line":193,"range":{"start_line":191,"start_character":11,"end_line":193,"end_character":68},"updated":"2016-05-05 11:16:18.000000000","message":"In a neutron world, we probably want to replace the above with something more modern, like the port uuids, and their attachements, possibly including the ip for each port.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":188,"context_line":"           \u0027old_task_state\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":189,"context_line":"           \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"           \u0027access_ip_v4\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":192,"context_line":"           \u0027access_ip_v6\u0027: fields.IPV6AddressField(nullable\u003dTrue),"},{"line_number":193,"context_line":"           \u0027fixed_ips\u0027: fields.ListOfObjectsField(\u0027FixedIpPayload\u0027),"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"           \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":196,"context_line":"       }"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_bf04eec5","line":193,"range":{"start_line":191,"start_character":11,"end_line":193,"end_character":68},"in_reply_to":"1a122d0e_77529114","updated":"2016-05-05 16:15:07.000000000","message":"I\u0027ve tried to come up with something in the next patch set but it is definitely up for debate. I guess port_uuid needs to be nullable to handle the nova-net case.\n\nWhat do you mean by attachments?\nHow should we expose floating ips?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":188,"context_line":"           \u0027old_task_state\u0027: fields.StringField(nullable\u003dTrue),"},{"line_number":189,"context_line":"           \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":190,"context_line":""},{"line_number":191,"context_line":"           \u0027access_ip_v4\u0027: fields.IPV4AddressField(nullable\u003dTrue),"},{"line_number":192,"context_line":"           \u0027access_ip_v6\u0027: fields.IPV6AddressField(nullable\u003dTrue),"},{"line_number":193,"context_line":"           \u0027fixed_ips\u0027: fields.ListOfObjectsField(\u0027FixedIpPayload\u0027),"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"           \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":196,"context_line":"       }"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_b4901897","line":193,"range":{"start_line":191,"start_character":11,"end_line":193,"end_character":68},"in_reply_to":"1a122d0e_bf04eec5","updated":"2016-05-06 10:15:41.000000000","message":"honestly, I would drop this for version 1, and maybe add something later.\n\nBy attachements, I mean a dict of uuid to port details.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027fault\u0027: fields.ObjectField(\u0027FaultPayload\u0027, nullable\u003dTrue),"},{"line_number":230,"context_line":"       }"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"       def __init__(self, instance):"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_347bf7bf","line":229,"updated":"2016-05-05 11:16:18.000000000","message":"I think we might also want target_uuid, which is nullable. So volume_uuid for volume attach, port_uuid for port_attach, image_uuid for build and rebuild, flavor_uuid for resize, etc.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027fault\u0027: fields.ObjectField(\u0027FaultPayload\u0027, nullable\u003dTrue),"},{"line_number":230,"context_line":"       }"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"       def __init__(self, instance):"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_b4e7783f","line":229,"in_reply_to":"1a122d0e_0910544d","updated":"2016-05-06 10:15:41.000000000","message":"You are right.\n\nMaybe the single target_uuid is a subclass we could use for all the ones it applies to?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":226,"context_line":""},{"line_number":227,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":228,"context_line":"       fields \u003d {"},{"line_number":229,"context_line":"           \u0027fault\u0027: fields.ObjectField(\u0027FaultPayload\u0027, nullable\u003dTrue),"},{"line_number":230,"context_line":"       }"},{"line_number":231,"context_line":""},{"line_number":232,"context_line":"       def __init__(self, instance):"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_0910544d","line":229,"in_reply_to":"1a122d0e_347bf7bf","updated":"2016-05-05 16:15:07.000000000","message":"If we have a single target per action then target_uuid works as a generic term but with multiple target per action this abstraction becomes limiting. I think we can use a base instance action payload and extend that with the extra pieces for every action. This is a bit more code but a more generic and future proof solution.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":298,"context_line":"   class FaultPayload(base.NovaObject):"},{"line_number":299,"context_line":"       # Version 1.0: Initial version"},{"line_number":300,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":301,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_6d2be282","line":298,"updated":"2016-05-05 11:16:18.000000000","message":"I think we should change this so its shared with the exception decorator, and has similar data in it.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":295,"context_line":""},{"line_number":296,"context_line":""},{"line_number":297,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":298,"context_line":"   class FaultPayload(base.NovaObject):"},{"line_number":299,"context_line":"       # Version 1.0: Initial version"},{"line_number":300,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":301,"context_line":"       fields \u003d {"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_04fafb76","line":298,"in_reply_to":"1a122d0e_6d2be282","updated":"2016-05-05 16:15:07.000000000","message":"Done","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":300,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":301,"context_line":"       fields \u003d {"},{"line_number":302,"context_line":"           \u0027message\u0027: fields.StringField(),"},{"line_number":303,"context_line":"           \u0027code\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":304,"context_line":"           \u0027exception\u0027: fields.StringField()"},{"line_number":305,"context_line":"       }"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_0d3b4ed2","line":303,"updated":"2016-05-05 11:16:18.000000000","message":"unsure if we want to keep this, see the notes in the exception decorator stuff below.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":300,"context_line":"       VERSION \u003d \u00271.0\u0027"},{"line_number":301,"context_line":"       fields \u003d {"},{"line_number":302,"context_line":"           \u0027message\u0027: fields.StringField(),"},{"line_number":303,"context_line":"           \u0027code\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":304,"context_line":"           \u0027exception\u0027: fields.StringField()"},{"line_number":305,"context_line":"       }"},{"line_number":306,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_44f8737c","line":303,"in_reply_to":"1a122d0e_0d3b4ed2","updated":"2016-05-05 16:15:07.000000000","message":"Done","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":330,"context_line":"       }"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Note that the payload of the compute.instance.delete.start and"},{"line_number":334,"context_line":"compute.instance.delete.end has the same structure therefore the same generic"},{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_5255e31b","line":333,"range":{"start_line":333,"start_character":29,"end_line":333,"end_character":36},"updated":"2016-05-05 11:16:18.000000000","message":"as we move things to the conductor, maybe we should drop the compute bit? not sure.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":330,"context_line":"       }"},{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Note that the payload of the compute.instance.delete.start and"},{"line_number":334,"context_line":"compute.instance.delete.end has the same structure therefore the same generic"},{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_841c4bc3","line":333,"range":{"start_line":333,"start_character":29,"end_line":333,"end_character":36},"in_reply_to":"1a122d0e_5255e31b","updated":"2016-05-05 16:15:07.000000000","message":"Done","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Note that the payload of the compute.instance.delete.start and"},{"line_number":334,"context_line":"compute.instance.delete.end has the same structure therefore the same generic"},{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."},{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_3271470d","line":334,"updated":"2016-05-05 11:16:18.000000000","message":"what about compute.instance.delete.error?","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":331,"context_line":""},{"line_number":332,"context_line":""},{"line_number":333,"context_line":"Note that the payload of the compute.instance.delete.start and"},{"line_number":334,"context_line":"compute.instance.delete.end has the same structure therefore the same generic"},{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."},{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_c4c64315","line":334,"in_reply_to":"1a122d0e_3271470d","updated":"2016-05-05 16:15:07.000000000","message":"It is the same so I added it to the list","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."},{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"},{"line_number":338,"context_line":"an extra field \u0027image_name\u0027 on top of InstanceActionPayload therefore"},{"line_number":339,"context_line":"that notification needs a new payload type and that therefore a new"},{"line_number":340,"context_line":"notification class too."},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_924adb81","line":338,"range":{"start_line":338,"start_character":0,"end_line":338,"end_character":27},"updated":"2016-05-05 11:16:18.000000000","message":"given you can get this from the instance object, I think we could drop that.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."},{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"},{"line_number":338,"context_line":"an extra field \u0027image_name\u0027 on top of InstanceActionPayload therefore"},{"line_number":339,"context_line":"that notification needs a new payload type and that therefore a new"},{"line_number":340,"context_line":"notification class too."},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_f43620b3","line":338,"range":{"start_line":338,"start_character":0,"end_line":338,"end_character":27},"in_reply_to":"1a122d0e_848f2bcc","updated":"2016-05-06 10:15:41.000000000","message":"+1 the need for subclassing, just trying to avoid it where we can.\n\nI think we could have a single helper method still for \"most\" notifications.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":335,"context_line":"InstanceActionPayload can be used in the model. This allows that both"},{"line_number":336,"context_line":"notifications can be created from the same InstanceActionNotification class."},{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"},{"line_number":338,"context_line":"an extra field \u0027image_name\u0027 on top of InstanceActionPayload therefore"},{"line_number":339,"context_line":"that notification needs a new payload type and that therefore a new"},{"line_number":340,"context_line":"notification class too."},{"line_number":341,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_848f2bcc","line":338,"range":{"start_line":338,"start_character":0,"end_line":338,"end_character":27},"in_reply_to":"1a122d0e_924adb81","updated":"2016-05-05 16:15:07.000000000","message":"let\u0027s drop image_name as it is available in the instance anyhow. In the generic case I think we still want subclassing if extra info is needed.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"},{"line_number":338,"context_line":"an extra field \u0027image_name\u0027 on top of InstanceActionPayload therefore"},{"line_number":339,"context_line":"that notification needs a new payload type and that therefore a new"},{"line_number":340,"context_line":"notification class too."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"This model is intended to hold the same information as the existing legacy"},{"line_number":343,"context_line":"notification however some changes are necessary:"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_d240d361","line":340,"updated":"2016-05-05 11:16:18.000000000","message":"what about thinking more about all instance events sharing a similar payload","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":337,"context_line":"However this solution is not universal. For example instance.create.start has"},{"line_number":338,"context_line":"an extra field \u0027image_name\u0027 on top of InstanceActionPayload therefore"},{"line_number":339,"context_line":"that notification needs a new payload type and that therefore a new"},{"line_number":340,"context_line":"notification class too."},{"line_number":341,"context_line":""},{"line_number":342,"context_line":"This model is intended to hold the same information as the existing legacy"},{"line_number":343,"context_line":"notification however some changes are necessary:"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_29dd5070","line":340,"in_reply_to":"1a122d0e_d240d361","updated":"2016-05-05 16:15:07.000000000","message":"Today it is not possible to do without removing the extra pieces some of the action adds to the payload. We can drop that information or we can have subclasses for the extended payload","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        fields \u003d {"},{"line_number":403,"context_line":"            \u0027function_name\u0027: fields.StringField(),"},{"line_number":404,"context_line":"            \u0027exception\u0027: fields.StringField(),"},{"line_number":405,"context_line":"            \u0027args\u0027: fields.ArgDictField(),"},{"line_number":406,"context_line":"        }"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_7268dff5","line":405,"updated":"2016-05-05 11:16:18.000000000","message":"I think we should look at more fields:\n\n* python module name that exception was caught in (not just function_name)\n* exception class that was raised\n* str(exception) output\n* instance_uuid and request_id, we certainly should include this in any notification where its known, just like we do in logs, maybe add this in the base notification?\n* ? maybe include the whole instance object, if its available?\n\nI would love us to look at emit a log message with all this info for every exception notification, just to make sure we always have both.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        fields \u003d {"},{"line_number":403,"context_line":"            \u0027function_name\u0027: fields.StringField(),"},{"line_number":404,"context_line":"            \u0027exception\u0027: fields.StringField(),"},{"line_number":405,"context_line":"            \u0027args\u0027: fields.ArgDictField(),"},{"line_number":406,"context_line":"        }"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_141484f3","line":405,"in_reply_to":"1a122d0e_699bc873","updated":"2016-05-06 10:15:41.000000000","message":"yeah, thats fair.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":402,"context_line":"        fields \u003d {"},{"line_number":403,"context_line":"            \u0027function_name\u0027: fields.StringField(),"},{"line_number":404,"context_line":"            \u0027exception\u0027: fields.StringField(),"},{"line_number":405,"context_line":"            \u0027args\u0027: fields.ArgDictField(),"},{"line_number":406,"context_line":"        }"},{"line_number":407,"context_line":""},{"line_number":408,"context_line":""}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_699bc873","line":405,"in_reply_to":"1a122d0e_7268dff5","updated":"2016-05-05 16:15:07.000000000","message":"* module name OK\n* exception class OK, this will be the exception field\n* str(exception) OK\n* instance_uuid, request_id as a nullable field is OK (I have to check how the logging gets them in the generic cases).\n* whole instance object: To include that we need to serialize the whole and then we get a similar situation as with the ArgDict in exception that it is not versioned properly. Also most of the data from the instance is already in the generic instance action payload. I think if we need this extra field for some use case then add that as a different patch separate from the transformation effort to keep the scope limited here.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"a23b6c546777ce5c6d34d86030c267cf0febf3a7","unresolved":false,"context_lines":[{"line_number":425,"context_line":"risk however this proposal does not change amount of internal data published it"},{"line_number":426,"context_line":"just transforms it to a bit more specified format. In the future we shall avoid"},{"line_number":427,"context_line":"adding such notifications but preventing it or removing the existing ones are"},{"line_number":428,"context_line":"outside of the scope of this spec."},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_4d8d467b","line":428,"updated":"2016-05-05 11:16:18.000000000","message":"Maybe we just drop the args from this notification? If we include the instance (if available), and request_id, folks we have more useful information than today anyways.\n\nBeing sure to log the extra info seems like a good compromise, and a nice step towards notifications and logging playing nicer together.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"74bee133528f88e7bdd0b23e1dd80146fa159b47","unresolved":false,"context_lines":[{"line_number":425,"context_line":"risk however this proposal does not change amount of internal data published it"},{"line_number":426,"context_line":"just transforms it to a bit more specified format. In the future we shall avoid"},{"line_number":427,"context_line":"adding such notifications but preventing it or removing the existing ones are"},{"line_number":428,"context_line":"outside of the scope of this spec."},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"1a122d0e_c9993c6f","line":428,"in_reply_to":"1a122d0e_4d8d467b","updated":"2016-05-05 16:15:07.000000000","message":"I tend to like the idea of dropping the args dict altogether to make the notification well defined.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"3e889540f142a1ce5d35bf34c9ab8741366a5b65","unresolved":false,"context_lines":[{"line_number":425,"context_line":"risk however this proposal does not change amount of internal data published it"},{"line_number":426,"context_line":"just transforms it to a bit more specified format. In the future we shall avoid"},{"line_number":427,"context_line":"adding such notifications but preventing it or removing the existing ones are"},{"line_number":428,"context_line":"outside of the scope of this spec."},{"line_number":429,"context_line":""},{"line_number":430,"context_line":""},{"line_number":431,"context_line":"REST API impact"}],"source_content_type":"text/x-rst","patch_set":12,"id":"dab17558_54f60cd8","line":428,"in_reply_to":"1a122d0e_c9993c6f","updated":"2016-05-06 10:15:41.000000000","message":"Yeah, lets do that.","commit_id":"d75eac9dd9e36a77b75c4d9c4dee9feea850c0a3"},{"author":{"_account_id":7634,"name":"Takashi Natsume","email":"takanattie@gmail.com","username":"natsumet"},"change_message_id":"c7b6a1d62315e114ba042734c219a0eb200a5319","unresolved":false,"context_lines":[{"line_number":257,"context_line":"           \u0027meta\u0027: fields.DictOfStringsField(),"},{"line_number":258,"context_line":"           \u0027port_uuid\u0027: fields.UUIDField(nullable\u003dTrue),"},{"line_number":259,"context_line":"           \u0027version\u0027: fields.IntegerField(),"},{"line_number":260,"context_line":"           \u0027address\u0027: fields.IPAddress(),"},{"line_number":261,"context_line":"       }"},{"line_number":262,"context_line":""},{"line_number":263,"context_line":"   @base.NovaObjectRegistry.register_if(False)"}],"source_content_type":"text/x-rst","patch_set":14,"id":"dab17558_f4174052","line":260,"range":{"start_line":260,"start_character":29,"end_line":260,"end_character":38},"updated":"2016-05-06 10:29:41.000000000","message":"It should be \u0027IPAddressField\u0027","commit_id":"326a67c62eee2062d7f1a97e13042ee68fe0aeb8"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"fdf88d296b1af6728ddf0ef1f90cc36f2ff7406b","unresolved":false,"context_lines":[{"line_number":30,"context_line":"As a tool developer I want to consume nova notifications to implement my"},{"line_number":31,"context_line":"requirements. I want to know what is the format of the notifications and I want"},{"line_number":32,"context_line":"to have some way to detect and follow up the changes in the notification format"},{"line_number":33,"context_line":"later on."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Proposed change"},{"line_number":36,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_09421868","line":33,"updated":"2016-05-10 16:59:28.000000000","message":"Would it be okay to also state a use case of providing full API visible object data so that consumers of notifications don\u0027t have to callback to Nova service APIs to fill in the gaps.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1740e8270842ab8b9bc7000ac4d3a590573dc19e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"As a tool developer I want to consume nova notifications to implement my"},{"line_number":31,"context_line":"requirements. I want to know what is the format of the notifications and I want"},{"line_number":32,"context_line":"to have some way to detect and follow up the changes in the notification format"},{"line_number":33,"context_line":"later on."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Proposed change"},{"line_number":36,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_2770c10a","line":33,"in_reply_to":"dab17558_09421868","updated":"2016-05-17 09:33:04.000000000","message":"I know that you want to avoid calling the REST APIs from searchlight but I think the notification shall not be a duplicate of the API response for two reasons:\n1) The difference of goals. The goal of notification is to indicate something is happened for whatever reasons (external or internal) while the goal of the API response is to respond to a specific external API request. This way the API response is always connected to the API request. The client getting the response knows the context of the response as it sent the request. In the other hand a notification stands alone. \n2) It is hard to provide the same response easily as notifications are emitted from deep in nova services not only from the API service.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"97e75312b6aca88d1988b5dbfd72cabdffd0df0e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"As a tool developer I want to consume nova notifications to implement my"},{"line_number":31,"context_line":"requirements. I want to know what is the format of the notifications and I want"},{"line_number":32,"context_line":"to have some way to detect and follow up the changes in the notification format"},{"line_number":33,"context_line":"later on."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Proposed change"},{"line_number":36,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_e1a5edb4","line":33,"in_reply_to":"dab17558_2770c10a","updated":"2016-05-17 16:10:04.000000000","message":"Hi Gibi,\n\nDon\u0027t mean to rock the boat here and know that you are well under way on the effort, so pardon a few more naive questions from me. :)\n\nSo, API formatting or not, is it possible to get the full object data in the payload? \n\nOr if the notifications always included everything that changed since the last time an event happened.\n\nWhy is it that notifications can\u0027t be configured to include a specific version of the API in its payload and use that as the version? Wouldn\u0027t that be easier for long term maintenance?","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"51eb29054ab8cb10084e05d129ba2d8c82970c43","unresolved":false,"context_lines":[{"line_number":30,"context_line":"As a tool developer I want to consume nova notifications to implement my"},{"line_number":31,"context_line":"requirements. I want to know what is the format of the notifications and I want"},{"line_number":32,"context_line":"to have some way to detect and follow up the changes in the notification format"},{"line_number":33,"context_line":"later on."},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"Proposed change"},{"line_number":36,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_88a51ea3","line":33,"in_reply_to":"dab17558_e1a5edb4","updated":"2016-05-17 17:48:39.000000000","message":"I think we managed to agree on a compromise on the meeting [1]. So let\u0027s try to avoid the simple to state but hard to achieve: ``lets put the same thing in the notification as in the API response`` and instead define what fields searchlight is really needed. Then we can add those extra fields as an next iteration after the transformation.\nThis compromise is mainly needed to limit the scope of this spec so that we have a chance to finish it.\n\n[1] http://eavesdrop.openstack.org/meetings/nova_notification/2016/nova_notification.2016-05-17-17.00.log.html","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":7665,"name":"Travis Tripp","email":"os.travis.tripp@gmail.com","username":"travis.tripp"},"change_message_id":"fdf88d296b1af6728ddf0ef1f90cc36f2ff7406b","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"instance.update and instance.delete"},{"line_number":109,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"The instance.delete and the instance.update notification has"},{"line_number":112,"context_line":"a partially common payload, so we can create some base classes and then mix"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_1c1ff808","line":109,"updated":"2016-05-10 16:59:28.000000000","message":"One problem I have with this spec and with the current docs [0] is that they are all written from the perspective of internal nova development with limited example for consumers of the notifications payload.  The samples dir [1] is great, but is it okay to show an example in the spec or just give a link?\n\n[0] http://docs.openstack.org/developer/nova/notifications.html\n[1] https://github.com/openstack/nova/tree/master/doc/notification_samples\n\nA comparison of payload to API call output would also be helpful.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1740e8270842ab8b9bc7000ac4d3a590573dc19e","unresolved":false,"context_lines":[{"line_number":106,"context_line":""},{"line_number":107,"context_line":""},{"line_number":108,"context_line":"instance.update and instance.delete"},{"line_number":109,"context_line":"~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~"},{"line_number":110,"context_line":""},{"line_number":111,"context_line":"The instance.delete and the instance.update notification has"},{"line_number":112,"context_line":"a partially common payload, so we can create some base classes and then mix"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_56665dbb","line":109,"in_reply_to":"dab17558_1c1ff808","updated":"2016-05-17 09:33:04.000000000","message":"I understand your problem. We definitely need consumer documentation as well. I feel that having samples is the first step in that direction. The second step will be the JSON schema generation for notifications which is in the pipe [2]. \n\nI don\u0027t think we shall lengthen the spec with a manually generated sample. I promise there will be samples included in the implementation. Actually there is already a PoC code up with sample included [3].\n\nI\u0027m hesitant to directly compare notification content with API content as for me the goal of the notification is not to be the same as the goal of the API response. Still you can do your comparison based on API sample and notification sample.\n\n[2] https://review.openstack.org/#/c/311194/\n[3] https://review.openstack.org/#/c/313654/1/doc/notification_samples/server-action.json","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"368fb2bebefb841de275facc12be88825b50fe5b","unresolved":false,"context_lines":[{"line_number":115,"context_line":"The following ServerPayload class holds the common part::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":118,"context_line":"   class ServerPayload(notification.NotificationPayloadBase):"},{"line_number":119,"context_line":"       SCHEMA \u003d {"},{"line_number":120,"context_line":"           \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":121,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_1c049dbe","line":118,"updated":"2016-05-06 15:25:32.000000000","message":"I would prefer to call this InstancePayload instead of ServerPayload, since all the notification event names refer to instance not server... Same for all the similarly-named classes below that use Server instead of Instance.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"deb9ca728856b2d93f4246a052f0fd471e241a25","unresolved":false,"context_lines":[{"line_number":115,"context_line":"The following ServerPayload class holds the common part::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":118,"context_line":"   class ServerPayload(notification.NotificationPayloadBase):"},{"line_number":119,"context_line":"       SCHEMA \u003d {"},{"line_number":120,"context_line":"           \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":121,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_83a63751","line":118,"in_reply_to":"dab17558_1c049dbe","updated":"2016-05-09 10:45:35.000000000","message":"I would rather we change the event names to match, agreed the miss match here is bad.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"bc27b6eff8af9c96a554aff5ca91db57de88e364","unresolved":false,"context_lines":[{"line_number":115,"context_line":"The following ServerPayload class holds the common part::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":118,"context_line":"   class ServerPayload(notification.NotificationPayloadBase):"},{"line_number":119,"context_line":"       SCHEMA \u003d {"},{"line_number":120,"context_line":"           \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":121,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_940666cc","line":118,"in_reply_to":"dab17558_83a63751","updated":"2016-05-09 15:14:28.000000000","message":"@johnthetubaguy: That would break every single deployment of Nova in existence...","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"1740e8270842ab8b9bc7000ac4d3a590573dc19e","unresolved":false,"context_lines":[{"line_number":115,"context_line":"The following ServerPayload class holds the common part::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":118,"context_line":"   class ServerPayload(notification.NotificationPayloadBase):"},{"line_number":119,"context_line":"       SCHEMA \u003d {"},{"line_number":120,"context_line":"           \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":121,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_a5be7162","line":118,"in_reply_to":"dab17558_940666cc","updated":"2016-05-17 09:33:04.000000000","message":"I think we don\u0027t want to change the legacy event names as that would really break the deployments. However as we are transforming the notifications to the new framework we are basically duplicating them (one legacy and one versioned). This gives us the possibility to only rename the versioned one which will not break the existing deployments using the legacy notifications.\n\nI\u0027m for consistency so I see two options:\na) Instance in the class name and instance in the even_type in the versioned notifications \nb) Server in the class name and server in the event_type in the versioned notifications\n\nHonestly I would go for b) as now we have a chance to fix the notification API so let\u0027s fix the naming on the API as well.","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"ceaf52febe3ee4a79cfb2705611fd50d55f78cac","unresolved":false,"context_lines":[{"line_number":115,"context_line":"The following ServerPayload class holds the common part::"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"   @base.NovaObjectRegistry.register_if(False)"},{"line_number":118,"context_line":"   class ServerPayload(notification.NotificationPayloadBase):"},{"line_number":119,"context_line":"       SCHEMA \u003d {"},{"line_number":120,"context_line":"           \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":121,"context_line":"           \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"}],"source_content_type":"text/x-rst","patch_set":16,"id":"dab17558_3ff39c74","line":118,"in_reply_to":"dab17558_a5be7162","updated":"2016-05-17 13:13:07.000000000","message":"After and IRC discussion[1] it seems only Jay has a firm opinion and his opinion is to use Instance. So lets with that.\n\n[1] http://eavesdrop.openstack.org/irclogs/%23openstack-nova/%23openstack-nova.2016-05-17.log.html#t2016-05-17T12:57:12","commit_id":"50256f18811c6f60b051eed6da4f4c57d768533f"}]}
