)]}'
{"doc/notification_samples/instance-create-end.json":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            \"tags\": {"},{"line_number":54,"context_line":"                \"nova_object.name\": \"TagsPayload\","},{"line_number":55,"context_line":"                \"nova_object.data\": {"},{"line_number":56,"context_line":"                    \"tags\": []"},{"line_number":57,"context_line":"                },"},{"line_number":58,"context_line":"                \"nova_object.version\": \"1.0\","},{"line_number":59,"context_line":"                \"nova_object.namespace\": \"nova\""}],"source_content_type":"application/json","patch_set":6,"id":"1a6eadb0_d3f4b0f3","line":56,"updated":"2016-12-14 10:34:02.000000000","message":"I think we should modify the notification sample test setup to have some tags added to the instance use for testing. This way can create a better notification samples.","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"77c321f7241e8422632ae0a56dc93e9ca6c12e6b","unresolved":false,"context_lines":[{"line_number":53,"context_line":"            \"tags\": {"},{"line_number":54,"context_line":"                \"nova_object.name\": \"TagsPayload\","},{"line_number":55,"context_line":"                \"nova_object.data\": {"},{"line_number":56,"context_line":"                    \"tags\": []"},{"line_number":57,"context_line":"                },"},{"line_number":58,"context_line":"                \"nova_object.version\": \"1.0\","},{"line_number":59,"context_line":"                \"nova_object.namespace\": \"nova\""}],"source_content_type":"application/json","patch_set":6,"id":"da4df55a_3a4b602d","line":56,"in_reply_to":"1a6eadb0_d3f4b0f3","updated":"2016-12-21 23:20:53.000000000","message":"Done","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"}],"doc/notification_samples/instance-create-start.json":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"daed4b4010c4d6731b6e7c28def78113a2cb2ec3","unresolved":false,"context_lines":[{"line_number":51,"context_line":"            \"tags\": {"},{"line_number":52,"context_line":"                \"nova_object.name\": \"TagsPayload\","},{"line_number":53,"context_line":"                \"nova_object.data\": {"},{"line_number":54,"context_line":"                    \"tags\": []"},{"line_number":55,"context_line":"                },"},{"line_number":56,"context_line":"                \"nova_object.version\": \"1.0\","},{"line_number":57,"context_line":"                \"nova_object.namespace\": \"nova\""}],"source_content_type":"application/json","patch_set":22,"id":"ba2be162_34a1d246","line":54,"range":{"start_line":54,"start_character":27,"end_line":54,"end_character":30},"updated":"2017-03-06 11:42:55.000000000","message":"we ca have some value once sever boot adds tag support.","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"}],"doc/notification_samples/instance-rebuild-start.json":[{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"52b7ded9cc6e4b0a187e91da184b84236a80ae7b","unresolved":false,"context_lines":[{"line_number":79,"context_line":"            \"fault\": null"},{"line_number":80,"context_line":"        }"},{"line_number":81,"context_line":"    }"},{"line_number":82,"context_line":"}"}],"source_content_type":"application/json","patch_set":25,"id":"1a1ced50_a937f0e1","line":82,"updated":"2017-03-17 16:13:37.000000000","message":"Nit: extra change in here I think.","commit_id":"48f61c428df0734c21df14b73920745e62f51223"}],"doc/notification_samples/instance-shelve_offload-end.json":[{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"daed4b4010c4d6731b6e7c28def78113a2cb2ec3","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    \"priority\":\"INFO\","},{"line_number":80,"context_line":"    \"publisher_id\":\"nova-compute:compute\""},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""}],"source_content_type":"application/json","patch_set":22,"id":"ba2be162_34b8f274","line":82,"range":{"start_line":82,"start_character":0,"end_line":82,"end_character":0},"updated":"2017-03-06 11:42:55.000000000","message":"unnecessary new line.","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"52b7ded9cc6e4b0a187e91da184b84236a80ae7b","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    \"priority\":\"INFO\","},{"line_number":81,"context_line":"    \"publisher_id\":\"nova-compute:compute\""},{"line_number":82,"context_line":"}"},{"line_number":83,"context_line":""}],"source_content_type":"application/json","patch_set":25,"id":"1a1ced50_c94b4c58","line":83,"updated":"2017-03-17 16:13:37.000000000","message":"Nit","commit_id":"48f61c428df0734c21df14b73920745e62f51223"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"883109bea545b7246874a6f6f55ccac34faa5ba8","unresolved":false,"context_lines":[{"line_number":79,"context_line":"    },"},{"line_number":80,"context_line":"    \"priority\":\"INFO\","},{"line_number":81,"context_line":"    \"publisher_id\":\"nova-compute:compute\""},{"line_number":82,"context_line":"}"}],"source_content_type":"application/json","patch_set":30,"id":"ffe62b97_a2656fe3","line":82,"updated":"2017-03-27 14:26:19.000000000","message":"I guess this is some file ending issue","commit_id":"213ed692968e8821d00caa1d186837c730ce0e73"}],"nova/compute/utils.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":372,"context_line":"            fault\u003dfault,"},{"line_number":373,"context_line":"            ip_addresses\u003dips,"},{"line_number":374,"context_line":"            flavor\u003dflavor,"},{"line_number":375,"context_line":"            tags\u003dtags)"},{"line_number":376,"context_line":"    notification \u003d instance_notification.InstanceActionNotification("},{"line_number":377,"context_line":"            context\u003dcontext,"},{"line_number":378,"context_line":"            priority\u003dpriority,"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_e83ffbd3","line":375,"updated":"2016-12-14 10:34:02.000000000","message":"I see some repetitive things here. Tags added to 3 places. I feel you just followed the existing patter of flavor and ip_address so this is OK for this patch.\nHowever I think we can remove the repetitiveness by moving the ip, flavor, and tags payload generation to the InstancePayload base class constructor. But this definitely needs a separate patch.\nSo this is change is OK for now and can be refactored in a later patch.","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8d62613927d623204e9f245baf6bae2ea554e2f4","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    if action \u003d\u003d fields.NotificationAction.CREATE:"},{"line_number":369,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":370,"context_line":"    else:"},{"line_number":371,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_b1250e0a","line":369,"range":{"start_line":368,"start_character":0,"end_line":369,"end_character":57},"updated":"2016-12-28 09:04:28.000000000","message":"This shouldn\u0027t be necessary as tags should be an empty list by default.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"f3bd2ee351ad27cda611def5bfc5a11e20d7dd1f","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    if action \u003d\u003d fields.NotificationAction.CREATE:"},{"line_number":369,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":370,"context_line":"    else:"},{"line_number":371,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_a64d0240","line":369,"range":{"start_line":368,"start_character":0,"end_line":369,"end_character":57},"in_reply_to":"ba5201f7_36c87222","updated":"2017-01-04 19:46:53.000000000","message":"Removed this check for simplicity.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c185770be49e795add11c00dee1daa477b60c2f3","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    if action \u003d\u003d fields.NotificationAction.CREATE:"},{"line_number":369,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":370,"context_line":"    else:"},{"line_number":371,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_36c87222","line":369,"range":{"start_line":368,"start_character":0,"end_line":369,"end_character":57},"in_reply_to":"da4df55a_1e97ba3a","updated":"2017-01-04 12:27:53.000000000","message":"I would rather we made instance_notification.TagsPayload.from_instance deal with both cases. It can check for is_attr_set or something like that.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"561b551372d4d47c3c4387cbf7e6ca8c4e78a6c8","unresolved":false,"context_lines":[{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":367,"context_line":""},{"line_number":368,"context_line":"    if action \u003d\u003d fields.NotificationAction.CREATE:"},{"line_number":369,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":370,"context_line":"    else:"},{"line_number":371,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":372,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_1e97ba3a","line":369,"range":{"start_line":368,"start_character":0,"end_line":369,"end_character":57},"in_reply_to":"da4df55a_b1250e0a","updated":"2016-12-28 17:05:23.000000000","message":"gibi, When an instance is created, it doesn\u0027t have tags loaded despite adding tags to INSTANCE_DEFAULT_FIELDS. Tags can\u0027t be applied at boot time so it will not be set. https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L493.\n\nSo when the instance object is created and returned and used for notifications, since instance.tags is not loaded, it will be fetched from db which is by default []. To avoid the db call, when action is CREATE or state is building, I have assigned it to empty list. This is just to avoid the db call for these notifications (CREATE and UPDATE).","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff55b1fb08a9e07dd9a1d3b0ef5de131e9a5c6bc","unresolved":false,"context_lines":[{"line_number":368,"context_line":"    if action \u003d\u003d fields.NotificationAction.CREATE:"},{"line_number":369,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":370,"context_line":"    else:"},{"line_number":371,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":372,"context_line":""},{"line_number":373,"context_line":"    fault, priority \u003d _get_fault_and_priority_from_exc(exception)"},{"line_number":374,"context_line":"    payload \u003d instance_notification.InstanceActionPayload("}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_d9f4b988","line":371,"updated":"2017-01-04 12:30:11.000000000","message":"Yeah, I would move this logic into the from_instance method.\n\nIts nasty to have everyone that calls that method deal with this niggle.","commit_id":"2125ef84fffeb3b3cf38b5a4680aec4cc0380d6a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c3a54116f565cfc21103247920431d3e12d4f84b","unresolved":false,"context_lines":[{"line_number":364,"context_line":"    ips \u003d _get_instance_ips(instance)"},{"line_number":365,"context_line":""},{"line_number":366,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":367,"context_line":"    tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":368,"context_line":""},{"line_number":369,"context_line":"    fault, priority \u003d _get_fault_and_priority_from_exc(exception)"},{"line_number":370,"context_line":"    payload \u003d instance_notification.InstanceActionPayload("}],"source_content_type":"text/x-python","patch_set":16,"id":"ba5201f7_b3a4e2b9","line":367,"updated":"2017-01-09 09:47:56.000000000","message":"I like the simplicity of this. Thanks!","commit_id":"542d67dc8922553884c2f01d4b67def358792170"}],"nova/notifications/base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8d62613927d623204e9f245baf6bae2ea554e2f4","unresolved":false,"context_lines":[{"line_number":282,"context_line":"    network_info \u003d instance.info_cache.network_info"},{"line_number":283,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    if state_update.state \u003d\u003d \u0027building\u0027:"},{"line_number":286,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":287,"context_line":"    else:"},{"line_number":288,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    versioned_payload \u003d instance_notification.InstanceUpdatePayload("}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_31675e4e","line":287,"range":{"start_line":285,"start_character":0,"end_line":287,"end_character":9},"updated":"2016-12-28 09:04:28.000000000","message":"This should not be necessary as tags should be an empty list by default.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"f3bd2ee351ad27cda611def5bfc5a11e20d7dd1f","unresolved":false,"context_lines":[{"line_number":282,"context_line":"    network_info \u003d instance.info_cache.network_info"},{"line_number":283,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    if state_update.state \u003d\u003d \u0027building\u0027:"},{"line_number":286,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":287,"context_line":"    else:"},{"line_number":288,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    versioned_payload \u003d instance_notification.InstanceUpdatePayload("}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_c6c3e687","line":287,"range":{"start_line":285,"start_character":0,"end_line":287,"end_character":9},"in_reply_to":"ba5201f7_16e28e9f","updated":"2017-01-04 19:46:53.000000000","message":"Done","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"561b551372d4d47c3c4387cbf7e6ca8c4e78a6c8","unresolved":false,"context_lines":[{"line_number":282,"context_line":"    network_info \u003d instance.info_cache.network_info"},{"line_number":283,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    if state_update.state \u003d\u003d \u0027building\u0027:"},{"line_number":286,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":287,"context_line":"    else:"},{"line_number":288,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    versioned_payload \u003d instance_notification.InstanceUpdatePayload("}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_fe503634","line":287,"range":{"start_line":285,"start_character":0,"end_line":287,"end_character":9},"in_reply_to":"da4df55a_31675e4e","updated":"2016-12-28 17:05:23.000000000","message":"Similar to instance create. This avoids db call.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c185770be49e795add11c00dee1daa477b60c2f3","unresolved":false,"context_lines":[{"line_number":282,"context_line":"    network_info \u003d instance.info_cache.network_info"},{"line_number":283,"context_line":"    flavor \u003d instance_notification.FlavorPayload(instance\u003dinstance)"},{"line_number":284,"context_line":""},{"line_number":285,"context_line":"    if state_update.state \u003d\u003d \u0027building\u0027:"},{"line_number":286,"context_line":"        tags \u003d instance_notification.TagsPayload(tags\u003d[])"},{"line_number":287,"context_line":"    else:"},{"line_number":288,"context_line":"        tags \u003d instance_notification.TagsPayload.from_instance(instance)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"    versioned_payload \u003d instance_notification.InstanceUpdatePayload("}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_16e28e9f","line":287,"range":{"start_line":285,"start_character":0,"end_line":287,"end_character":9},"in_reply_to":"da4df55a_fe503634","updated":"2017-01-04 12:27:53.000000000","message":"I think the simplicity is worth the extra DB call, if it happens.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"}],"nova/notifications/objects/instance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027metadata\u0027: (\u0027instance\u0027, \u0027metadata\u0027),"},{"line_number":49,"context_line":"    }"},{"line_number":50,"context_line":"    # Version 1.0: Initial version"},{"line_number":51,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":52,"context_line":"    fields \u003d {"},{"line_number":53,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"},{"line_number":54,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_c8595f00","line":51,"updated":"2016-12-14 10:34:02.000000000","message":"why we are jumping two versions? Is it because of the parallel patch adding display_description? If yes, then I suggest to put this patch top of that as this 1.2 already creates an ordering of the commits.","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"77c321f7241e8422632ae0a56dc93e9ca6c12e6b","unresolved":false,"context_lines":[{"line_number":48,"context_line":"        \u0027metadata\u0027: (\u0027instance\u0027, \u0027metadata\u0027),"},{"line_number":49,"context_line":"    }"},{"line_number":50,"context_line":"    # Version 1.0: Initial version"},{"line_number":51,"context_line":"    VERSION \u003d \u00271.2\u0027"},{"line_number":52,"context_line":"    fields \u003d {"},{"line_number":53,"context_line":"        \u0027uuid\u0027: fields.UUIDField(),"},{"line_number":54,"context_line":"        \u0027user_id\u0027: fields.StringField(nullable\u003dTrue),"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_1a5dbce9","line":51,"in_reply_to":"1a6eadb0_c8595f00","updated":"2016-12-21 23:20:53.000000000","message":"Done. Added this patch on top of https://review.openstack.org/#/c/407128/","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":219,"context_line":"    # Version 1.0: Initial version"},{"line_number":220,"context_line":"    VERSION \u003d \u00271.0\u0027"},{"line_number":221,"context_line":"    fields \u003d {"},{"line_number":222,"context_line":"        \u0027tags\u0027: fields.ListOfStringsField()"},{"line_number":223,"context_line":"    }"},{"line_number":224,"context_line":""},{"line_number":225,"context_line":"    @classmethod"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_333ec4b8","line":222,"updated":"2016-12-14 10:34:02.000000000","message":"good catch that tags are represented as resource_id - tag pairs internally but for a specific instance we only interested in the tag part of this data.","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    @classmethod"},{"line_number":226,"context_line":"    def from_instance(cls, instance):"},{"line_number":227,"context_line":"        tags \u003d []"},{"line_number":228,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":229,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":230,"context_line":"        return cls(tags\u003dtags)"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_f3e1acff","line":228,"updated":"2016-12-14 10:34:02.000000000","message":"This will force the instance to lazy-load the tags from the db if that field has not been loaded yet. We have similar situation in the flavor notifications patch [1]. I think we have to discuss this on the next nova meeting as I don\u0027t have the full picture if it causes real performance issue or not.\n\n[1] https://review.openstack.org/#/c/398171/9/nova/objects/flavor.py@580","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"770ba1e08b85043451e869eb32365d5503f63351","unresolved":false,"context_lines":[{"line_number":225,"context_line":"    @classmethod"},{"line_number":226,"context_line":"    def from_instance(cls, instance):"},{"line_number":227,"context_line":"        tags \u003d []"},{"line_number":228,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":229,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":230,"context_line":"        return cls(tags\u003dtags)"},{"line_number":231,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_faa13447","line":228,"in_reply_to":"1a6eadb0_f3e1acff","updated":"2016-12-15 14:58:08.000000000","message":"We discussed the lazy-load issue on the nova meeting [1]. The agreed way forward is to make tags loaded by default. So you basically need to add the tags to the list here: [2] \n\n[1] http://eavesdrop.openstack.org/meetings/nova/2016/nova.2016-12-15-14.03.log.html#l-202\n[2] https://github.com/openstack/nova/blob/master/nova/objects/instance.py#L66","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"c185770be49e795add11c00dee1daa477b60c2f3","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    @classmethod"},{"line_number":238,"context_line":"    def from_instance(cls, instance):"},{"line_number":239,"context_line":"        tags \u003d []"},{"line_number":240,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":241,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":242,"context_line":"        return cls(tags\u003dtags)"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_d9c67948","line":240,"updated":"2017-01-04 12:27:53.000000000","message":"I think here you probably want to check instance.obj_attr_is_set(\"tags\") and skip the loop if thats not true.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"f3bd2ee351ad27cda611def5bfc5a11e20d7dd1f","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    @classmethod"},{"line_number":238,"context_line":"    def from_instance(cls, instance):"},{"line_number":239,"context_line":"        tags \u003d []"},{"line_number":240,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":241,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":242,"context_line":"        return cls(tags\u003dtags)"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_b456085a","line":240,"in_reply_to":"ba5201f7_d9c67948","updated":"2017-01-04 19:46:53.000000000","message":"Since tags is not a default field yet, if this check is added it would never return true.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"ff55b1fb08a9e07dd9a1d3b0ef5de131e9a5c6bc","unresolved":false,"context_lines":[{"line_number":238,"context_line":"    def from_instance(cls, instance):"},{"line_number":239,"context_line":"        tags \u003d []"},{"line_number":240,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":241,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":242,"context_line":"        return cls(tags\u003dtags)"},{"line_number":243,"context_line":""},{"line_number":244,"context_line":""}],"source_content_type":"text/x-python","patch_set":15,"id":"ba5201f7_592fe9f5","line":241,"updated":"2017-01-04 12:30:11.000000000","message":"see comment on previous patchset.","commit_id":"2125ef84fffeb3b3cf38b5a4680aec4cc0380d6a"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"c3a54116f565cfc21103247920431d3e12d4f84b","unresolved":false,"context_lines":[{"line_number":237,"context_line":"    @classmethod"},{"line_number":238,"context_line":"    def from_instance(cls, instance):"},{"line_number":239,"context_line":"        tags \u003d []"},{"line_number":240,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":241,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":242,"context_line":"        return cls(tags\u003dtags)"},{"line_number":243,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"ba5201f7_33f552cb","line":240,"range":{"start_line":240,"start_character":29,"end_line":240,"end_character":49},"updated":"2017-01-09 09:47:56.000000000","message":"As far as I understand instance.tags will be initialized to [] by lazy-load even during instance.create so this will not fail and default the TagPayload.tags to []. This looks good. Thanks!","commit_id":"542d67dc8922553884c2f01d4b67def358792170"},{"author":{"_account_id":7,"name":"Jay Pipes","email":"jaypipes@gmail.com","username":"jaypipes"},"change_message_id":"a8f1fe311f7d8fe30620b2122e66e685a5c054d3","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":87,"context_line":"        \u0027tags\u0027: fields.ObjectField(\u0027TagsPayload\u0027),"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":90,"context_line":"        \u0027locked\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"ffe62b97_b2b5b080","line":87,"updated":"2017-03-27 19:52:03.000000000","message":"Why not just a fields.ListOfStringsField()? tags are nothing more than that.","commit_id":"213ed692968e8821d00caa1d186837c730ce0e73"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"9cb80f3465839ce314ed9d80b91950d6a0559ba4","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":87,"context_line":"        \u0027tags\u0027: fields.ObjectField(\u0027TagsPayload\u0027),"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":90,"context_line":"        \u0027locked\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"ffe62b97_cb74d6d1","line":87,"in_reply_to":"ffe62b97_0a73eab2","updated":"2017-03-28 15:19:32.000000000","message":"Agree but TagsPayload Object details are sent only once in the Payload. I feel either way is fine. Change is simple but I\u0027ll have to change more than 40 notification sample files :(","commit_id":"213ed692968e8821d00caa1d186837c730ce0e73"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"f961b68ac1262a6ac0d0f5dc31a476dc9b7ce141","unresolved":false,"context_lines":[{"line_number":84,"context_line":"        \u0027progress\u0027: fields.IntegerField(nullable\u003dTrue),"},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        \u0027ip_addresses\u0027: fields.ListOfObjectsField(\u0027IpPayload\u0027),"},{"line_number":87,"context_line":"        \u0027tags\u0027: fields.ObjectField(\u0027TagsPayload\u0027),"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":"        \u0027metadata\u0027: fields.DictOfStringsField(),"},{"line_number":90,"context_line":"        \u0027locked\u0027: fields.BooleanField(),"}],"source_content_type":"text/x-python","patch_set":30,"id":"ffe62b97_0a73eab2","line":87,"in_reply_to":"ffe62b97_b2b5b080","updated":"2017-03-28 09:28:35.000000000","message":"Good catch. This is unnecessary complex now.\n\nBtw, when we flatten this structure we have to move the code in L213-L216 to be called from InstancePayload __init__ which is more in line with the refactoring in https://review.openstack.org/#/c/418488/5/nova/notifications/objects/instance.py","commit_id":"213ed692968e8821d00caa1d186837c730ce0e73"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"66ab46cb3bf2a7e6880bfdaf6eb76f25f691d803","unresolved":false,"context_lines":[{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("},{"line_number":110,"context_line":"            ip_addresses\u003dips,"}],"source_content_type":"text/x-python","patch_set":34,"id":"ffe62b97_289c0f5c","line":107,"range":{"start_line":105,"start_character":0,"end_line":107,"end_character":41},"updated":"2017-03-30 09:18:49.000000000","message":"nit: this can be written as a list comprehension:\ntags \u003d [instance_tag.tag for instance_tag in instance.tags.objects]","commit_id":"8786aa69fb8c1cc6bd4462be77fa50bf1176b1ad"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":20,"context_line":"class InstancePayload(base.NotificationPayloadBase):"},{"line_number":21,"context_line":"    SCHEMA \u003d {"},{"line_number":22,"context_line":"        \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":23,"context_line":"        \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"},{"line_number":24,"context_line":"        \u0027tenant_id\u0027: (\u0027instance\u0027, \u0027project_id\u0027),"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_c6cf68ae","line":21,"updated":"2017-04-07 18:00:42.000000000","message":"Why isn\u0027t tags in the schema?","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"7c323f9e6dc9d5fc6965e33b1eec5ca027b848f6","unresolved":false,"context_lines":[{"line_number":18,"context_line":""},{"line_number":19,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":20,"context_line":"class InstancePayload(base.NotificationPayloadBase):"},{"line_number":21,"context_line":"    SCHEMA \u003d {"},{"line_number":22,"context_line":"        \u0027uuid\u0027: (\u0027instance\u0027, \u0027uuid\u0027),"},{"line_number":23,"context_line":"        \u0027user_id\u0027: (\u0027instance\u0027, \u0027user_id\u0027),"},{"line_number":24,"context_line":"        \u0027tenant_id\u0027: (\u0027instance\u0027, \u0027project_id\u0027),"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_f3d0b321","line":21,"in_reply_to":"bff0334d_c6cf68ae","updated":"2017-04-10 21:04:36.000000000","message":"tags is not directly mapped from instance. instance.tags is a TagsList object where as tags here is a list of strings. So this is not added to schema. Instead mapping is done on L105-L112.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        network_info \u003d utils.get_nw_info_for_instance(instance)"},{"line_number":101,"context_line":"        ips \u003d IpPayload.from_network_info(network_info)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_72c0c051","line":103,"range":{"start_line":103,"start_character":53,"end_line":103,"end_character":68},"updated":"2017-04-13 22:41:41.000000000","message":"To Sujitha\u0027s point below, is this lazy-loaded since flavor is not loaded by default when we get an instance.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5cc64832c8c685e9cdd274e8b6c13a35c1bcc47a","unresolved":false,"context_lines":[{"line_number":100,"context_line":"        network_info \u003d utils.get_nw_info_for_instance(instance)"},{"line_number":101,"context_line":"        ips \u003d IpPayload.from_network_info(network_info)"},{"line_number":102,"context_line":""},{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_0fce4eb3","line":103,"range":{"start_line":103,"start_character":53,"end_line":103,"end_character":68},"in_reply_to":"7ffa3b31_72c0c051","updated":"2017-04-20 15:39:35.000000000","message":"instance.flavor is lazy-loaded here.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_26ea940e","line":106,"range":{"start_line":106,"start_character":41,"end_line":106,"end_character":49},"updated":"2017-04-07 18:00:42.000000000","message":"I don\u0027t think we actually have to access the internal list like this, the ObjectListBase is iterable.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_26d4d41f","line":106,"range":{"start_line":106,"start_character":28,"end_line":106,"end_character":41},"updated":"2017-04-07 18:00:42.000000000","message":"Isn\u0027t this going to lazy-load instance.tags on every notification? Or are we always loading instances with tags by default now?","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5cc64832c8c685e9cdd274e8b6c13a35c1bcc47a","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_ef4b2228","line":106,"range":{"start_line":106,"start_character":28,"end_line":106,"end_character":41},"in_reply_to":"7ffa3b31_12ae1ce7","updated":"2017-04-20 15:39:35.000000000","message":"Moved this to be part only of the InstanceUpdatePayload. There instance.tags will be lazy-loaded.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_12ae1ce7","line":106,"range":{"start_line":106,"start_character":28,"end_line":106,"end_character":41},"in_reply_to":"bff0334d_0b0d3ea0","updated":"2017-04-13 22:41:41.000000000","message":"\u003e In that case putting tags to every InstanceActionPayload would cause 0 extra db query.\n\nThat\u0027s not really true because as noted in https://review.openstack.org/#/c/415298/ then we\u0027re still loading up and joining on the tags table everytime we load an instance, when we really don\u0027t need it I don\u0027t think. We just need the tags for the instance create/update IMO, not pause/suspend/resize etc etc.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"26921bc8cb8fb6ba3712a0365c318d298ad167e6","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_c6b528cf","line":106,"range":{"start_line":106,"start_character":28,"end_line":106,"end_character":41},"in_reply_to":"bff0334d_26d4d41f","updated":"2017-04-07 18:06:17.000000000","message":"I thought https://review.openstack.org/#/c/415298/ was going to be before this change. I\u0027m -1 on adding tags to all notifications basically before we figure out what we\u0027re going to do about lazy-loading this, or if it\u0027s really needed in every notification. If we just need it for filling in the compute REST API with searchlight, then we just need it for instance create/update when the tags are applied or changed. I really don\u0027t think we should be lazy-loading this for every instance action notification.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"31184172ac423937155c18de833e362e188f4c99","unresolved":false,"context_lines":[{"line_number":103,"context_line":"        flavor \u003d flavor_payload.FlavorPayload(flavor\u003dinstance.flavor)"},{"line_number":104,"context_line":""},{"line_number":105,"context_line":"        tags \u003d []"},{"line_number":106,"context_line":"        for instance_tag in instance.tags.objects:"},{"line_number":107,"context_line":"            tags.append(instance_tag.tag)"},{"line_number":108,"context_line":""},{"line_number":109,"context_line":"        super(InstancePayload, self).__init__("}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_0b0d3ea0","line":106,"range":{"start_line":106,"start_character":28,"end_line":106,"end_character":41},"in_reply_to":"bff0334d_c6b528cf","updated":"2017-04-10 07:46:03.000000000","message":"This patch series went to the direction to make tags loaded by default to avoid dealing with the lazy load problem. In that case putting tags to every InstanceActionPayload would cause 0 extra db query.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_a6746469","line":119,"updated":"2017-04-07 18:00:42.000000000","message":"Why do we need to update the InstanceActionPayload? Do we really need instance.tags information in instance action payloads? I thought we really cared about tags for instance.create/update operations for representing those in searchlight? I\u0027m not sure why I care what the instance tags are when suspending an instance, for example.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"31184172ac423937155c18de833e362e188f4c99","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_6b6baa84","line":119,"in_reply_to":"bff0334d_0618b0d0","updated":"2017-04-10 07:46:03.000000000","message":"Currently instance.create uses InstanceActionPayload this is why tags are added here in the first place. Payoad type needs to be change for instance.create if we want to limit tags to instance.create and instance.update.\n\nYes, tags could only have new value in instance.create and instance.update and not for example in instance.suspend. \nJust to note instance.update is emitted anyhow along with the instance.suspend as the state of the instance is updated during the suspend action.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_d2ef94e7","line":119,"in_reply_to":"bff0334d_6b6baa84","updated":"2017-04-13 22:41:41.000000000","message":"gibi:\n\n\u003e Just to note instance.update is emitted anyhow along with the instance.suspend as the state of the instance is updated during the suspend action.\n\nThat\u0027s true, I hadn\u0027t thought about that, but we don\u0027t send anything for instance.update if CONF.notifications.notify_on_state_change is not set, which by default it\u0027s not. I worry about generating payloads for versioned notifications which aren\u0027t going to be consumed, and lazy-loading things as part of that especially when it\u0027s a waste.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"7c323f9e6dc9d5fc6965e33b1eec5ca027b848f6","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_8137d4ff","line":119,"in_reply_to":"bff0334d_6b6baa84","updated":"2017-04-10 21:04:36.000000000","message":"yes.. Added it to InstanceActionPayload as it is used by instance.create.\n\nComing to suspend example, do we really need flavor or ip_address information in instance.suspend notification payload. I don\u0027t think they are changed during suspend, but we are sending flavor and ip_address info in the notification.How is this a different case from tags? Is this only about db load?","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_723200aa","line":119,"in_reply_to":"bff0334d_8137d4ff","updated":"2017-04-13 22:41:41.000000000","message":"Yes it\u0027s about DB load, because as Dan Smith pointed out in https://review.openstack.org/#/c/415298/ the point of lazy-loads is to only get things in a rare case when we need them, not to perform a massive join when we pull an instance from the database every time.\n\nAs for the payload this is in, that also came up in this change:\n\nhttps://review.openstack.org/#/c/453077/2/doc/notification_samples/instance-snapshot-end.json@71\n\nBut basically I think with every action using the same payload we have painted ourselves into a corner because now anytime one action needs something new in the payload, all action notifications have to be updated to use that new field. We should have probably created unique payloads which extended a common base from the start. Our solution in that change was creating a new payload type but still bumping the version it:\n\nhttps://review.openstack.org/#/c/453077/4/nova/notifications/objects/instance.py@348\n\nAs for flavors and IPs, we load info_cache by default so IPs should be OK, but what are we doing about flavors? Those are not joined by default, so are we lazy-loading those for every action payload notification?","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"901f27719ad7691948eecb23f0171d51ff69aea1","unresolved":false,"context_lines":[{"line_number":116,"context_line":""},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":119,"context_line":"class InstanceActionPayload(InstancePayload):"},{"line_number":120,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":121,"context_line":""},{"line_number":122,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_0618b0d0","line":119,"in_reply_to":"bff0334d_a6746469","updated":"2017-04-07 18:09:56.000000000","message":"It even says in the blueprint:\n\n\"Step1: Add simple fields to instance.create and instance.update\"","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":137,"context_line":"class InstanceActionVolumeSwapPayload(InstanceActionPayload):"},{"line_number":138,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_46691889","line":137,"updated":"2017-04-07 18:00:42.000000000","message":"Same, why do we care about tags for volume swap?","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":137,"context_line":"class InstanceActionVolumeSwapPayload(InstanceActionPayload):"},{"line_number":138,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_d2c8b475","line":137,"in_reply_to":"bff0334d_2b07e2cc","updated":"2017-04-13 22:41:41.000000000","message":"Yeah I think we need to do that so we\u0027re not propagating a full instance representation for every action imaginable. I think we should e fine with a basic representation of an instance for all action payloads, but others that require some more detail should have unique payloads for that data.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"31184172ac423937155c18de833e362e188f4c99","unresolved":false,"context_lines":[{"line_number":134,"context_line":""},{"line_number":135,"context_line":""},{"line_number":136,"context_line":"@nova_base.NovaObjectRegistry.register_notification"},{"line_number":137,"context_line":"class InstanceActionVolumeSwapPayload(InstanceActionPayload):"},{"line_number":138,"context_line":"    # No SCHEMA as all the additional fields are calculated"},{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    # Version 1.1: locked and display_description added to InstancePayload"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_2b07e2cc","line":137,"in_reply_to":"bff0334d_46691889","updated":"2017-04-10 07:46:03.000000000","message":"The instance.create uses InstanceActionPayload so it is added there and InstanceActionVolumeSwapPayload inherits from InstanceActionPayload so we got tags here automatically. If we change the payload type of instance.create to a unique descendant to InstanceActionPayload that will solve this problem too.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"}],"nova/objects/instance.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5c8557ff07f8fee5fb92f83494ddb806345724fe","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        pass"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    def _save_tags(self, context):"},{"line_number":650,"context_line":"        pass"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def _save_extra_generic(self, field):"},{"line_number":653,"context_line":"        if field in self.obj_what_changed():"}],"source_content_type":"text/x-python","patch_set":6,"id":"1a6eadb0_48f46f85","line":650,"updated":"2016-12-14 10:34:02.000000000","message":"Where this is called from? Is it really necessary?","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"77c321f7241e8422632ae0a56dc93e9ca6c12e6b","unresolved":false,"context_lines":[{"line_number":647,"context_line":"        pass"},{"line_number":648,"context_line":""},{"line_number":649,"context_line":"    def _save_tags(self, context):"},{"line_number":650,"context_line":"        pass"},{"line_number":651,"context_line":""},{"line_number":652,"context_line":"    def _save_extra_generic(self, field):"},{"line_number":653,"context_line":"        if field in self.obj_what_changed():"}],"source_content_type":"text/x-python","patch_set":6,"id":"da4df55a_3a20c049","line":650,"in_reply_to":"1a6eadb0_48f46f85","updated":"2016-12-21 23:20:53.000000000","message":"yes. looks like this is not needed. Whenever there is a mismatch in versioned notification, I get error saying _save_tags method is missing. So added this.  I fixed all the mismatches, this is not needed.","commit_id":"05e78cba8f43d94a7399ec463b8aea206ed4c0dd"}],"nova/tests/functional/notification_sample_tests/notification_sample_base.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"fd555de004aba5db1d21f7118a75a706dadd8088","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":183,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":184,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_90af6893","line":182,"updated":"2017-02-22 15:15:33.000000000","message":"I think you should reset the microversion back to the original after you added the tag so that the rest of the test case uses the microversion set before the server boot.","commit_id":"5ffb749cfd08f04b188e0306ef1fa822b4558652"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"ae1a1e756660f5989cb8a36e432bdefc2bf3af27","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":183,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":184,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":185,"context_line":""}],"source_content_type":"text/x-python","patch_set":20,"id":"da36d5c6_d839f4d8","line":182,"in_reply_to":"da36d5c6_90af6893","updated":"2017-02-22 21:25:44.000000000","message":"Done","commit_id":"5ffb749cfd08f04b188e0306ef1fa822b4558652"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"61a294b3b6b4aef78a6f353e0bd584032781f7a9","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a30ddce_5b7f15aa","line":187,"updated":"2017-03-07 18:46:04.000000000","message":"seems a bit like a hack, but I can\u0027t think of a better way.","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"},{"author":{"_account_id":8556,"name":"Ghanshyam Maan","display_name":"Ghanshyam Maan","email":"gmaan.os14@gmail.com","username":"ghanshyam"},"change_message_id":"ac9ae4dda2595804dabf59f92a0e6e9e2e16619c","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_20c165e5","line":187,"in_reply_to":"3a1ff146_dfd4fc48","updated":"2017-03-15 02:04:49.000000000","message":"+1 on using the max version always.\n\nIf failure happen in adding server tags(L187) then 2.26 is left on self.api_microversion. So it should be in try finally call at least.\n\nBut i saw next patch from gibi so m ok with this as of now.","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"402b35f5b48190cf68a15b31d008f89119c29e15","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"}],"source_content_type":"text/x-python","patch_set":22,"id":"3a1ff146_dfd4fc48","line":187,"in_reply_to":"9a30ddce_3106b086","updated":"2017-03-14 17:48:21.000000000","message":"Yeah, totally agreed with the behaviour, just feels a bit odd somehow.","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"506deba99b3ecddcc4e7f80c39abd34ae4655afa","unresolved":false,"context_lines":[{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"}],"source_content_type":"text/x-python","patch_set":22,"id":"9a30ddce_3106b086","line":187,"in_reply_to":"9a30ddce_5b7f15aa","updated":"2017-03-09 15:15:56.000000000","message":"the content of the notifications are always reflects what is needed for the max microversion of the REST API so I feel we can simply default the notification tests to use max microversion all the time. I\u0027ve proposed a patch https://review.openstack.org/#/c/443686/","commit_id":"ba25a0ddab01f897e29f4cadde89090f32ff9d39"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        microversion \u003d self.api.microversion"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":191,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_6603fcb9","line":188,"range":{"start_line":182,"start_character":8,"end_line":188,"end_character":44},"updated":"2017-04-07 18:00:42.000000000","message":"Seems this should be in a try/finally so we are sure to always reset the microversion on the self.api object.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"72db6467d532677fcd780dab2c70b6d15bca5164","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        microversion \u003d self.api.microversion"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":191,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_eda0ca92","line":188,"range":{"start_line":182,"start_character":8,"end_line":188,"end_character":44},"in_reply_to":"7ffa3b31_d276743f","updated":"2017-04-20 16:25:26.000000000","message":"Done","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"31184172ac423937155c18de833e362e188f4c99","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        microversion \u003d self.api.microversion"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":191,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_ebfd7a6e","line":188,"range":{"start_line":182,"start_character":8,"end_line":188,"end_character":44},"in_reply_to":"bff0334d_6603fcb9","updated":"2017-04-10 07:46:03.000000000","message":"Merging this https://review.openstack.org/#/c/443686/ would remove this problem.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"2383207808f750ce302760527f832edbe9c6ec15","unresolved":false,"context_lines":[{"line_number":179,"context_line":"        return found_server"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":182,"context_line":"        microversion \u003d self.api.microversion"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"        self.api.microversion \u003d \u00272.26\u0027"},{"line_number":185,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":186,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":187,"context_line":"        # Reset microversion back to the original"},{"line_number":188,"context_line":"        self.api.microversion \u003d microversion"},{"line_number":189,"context_line":""},{"line_number":190,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":191,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_d276743f","line":188,"range":{"start_line":182,"start_character":8,"end_line":188,"end_character":44},"in_reply_to":"bff0334d_ebfd7a6e","updated":"2017-04-13 22:41:41.000000000","message":"Maybe this change should be rebased on top of that one.","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fbb4dac6622d2fc4679043df389a3505d6f11f0","unresolved":false,"context_lines":[{"line_number":193,"context_line":""},{"line_number":194,"context_line":"    def _add_server_tags(self, server, tag):"},{"line_number":195,"context_line":"        body \u003d {\"tags\": [tag]}"},{"line_number":196,"context_line":"        self.api.api_put(\u0027servers/%s/tags\u0027 % (server[\u0027id\u0027]), body)"},{"line_number":197,"context_line":""},{"line_number":198,"context_line":"    def _wait_until_deleted(self, server):"},{"line_number":199,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_da4dbb9a","line":196,"updated":"2017-04-20 22:46:28.000000000","message":"I recently added put_server_tags in the API client:\n\nhttps://github.com/openstack/nova/blob/master/nova/tests/functional/api/client.py#L404\n\nBut this is OK as well.","commit_id":"e0017ee7af60ebc23205dc752ce38756643d822b"}],"nova/tests/unit/compute/test_compute_mgr.py":[{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8d62613927d623204e9f245baf6bae2ea554e2f4","unresolved":false,"context_lines":[{"line_number":3355,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3356,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3357,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3358,"context_line":"                               \u0027tags\u0027])"},{"line_number":3359,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3360,"context_line":"        self.injected_files \u003d []"},{"line_number":3361,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_71eba678","line":3358,"updated":"2016-12-28 09:04:28.000000000","message":"Is it something that related to making the tags loaded by default? If yes then this should be in the first patch of the series","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":782,"name":"John Garbutt","email":"john@johngarbutt.com","username":"johngarbutt"},"change_message_id":"1aa988589ca6e75a2beb1f44457702b07dbfffc8","unresolved":false,"context_lines":[{"line_number":3355,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3356,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3357,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3358,"context_line":"                               \u0027tags\u0027])"},{"line_number":3359,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3360,"context_line":"        self.injected_files \u003d []"},{"line_number":3361,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba5201f7_f6218afc","line":3358,"in_reply_to":"da4df55a_5fb93bcb","updated":"2017-01-04 12:02:45.000000000","message":"Yeah, I think we need to add the tag loading by default at the end of this series.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"561b551372d4d47c3c4387cbf7e6ca8c4e78a6c8","unresolved":false,"context_lines":[{"line_number":3355,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3356,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3357,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3358,"context_line":"                               \u0027tags\u0027])"},{"line_number":3359,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3360,"context_line":"        self.injected_files \u003d []"},{"line_number":3361,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_be530e38","line":3358,"in_reply_to":"da4df55a_71eba678","updated":"2016-12-28 17:05:23.000000000","message":"you are right. This should be in the other patch.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":18337,"name":"Sujitha","email":"sujitha.neti@intel.com","username":"Sujitha"},"change_message_id":"0195cbf2e501347e6a1826c331919af0e2759304","unresolved":false,"context_lines":[{"line_number":3355,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3356,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3357,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3358,"context_line":"                               \u0027tags\u0027])"},{"line_number":3359,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3360,"context_line":"        self.injected_files \u003d []"},{"line_number":3361,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_5fb93bcb","line":3358,"in_reply_to":"da4df55a_be530e38","updated":"2016-12-28 23:13:59.000000000","message":"gibi, Sorry. These tests fail only when tags is added to notifications. So this change should be here.","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8d62613927d623204e9f245baf6bae2ea554e2f4","unresolved":false,"context_lines":[{"line_number":4563,"context_line":"                    mock.ANY, \u0027expected_task_state\u0027: \u0027spawning\u0027}"},{"line_number":4564,"context_line":"            expected_call \u003d mock.call(self.context, self.instance.uuid,"},{"line_number":4565,"context_line":"                    updates, columns_to_join\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027,"},{"line_number":4566,"context_line":"                        \u0027info_cache\u0027, \u0027tags\u0027])"},{"line_number":4567,"context_line":"            last_update_call \u003d mock_db_update.call_args_list["},{"line_number":4568,"context_line":"                mock_db_update.call_count - 1]"},{"line_number":4569,"context_line":"            self.assertEqual(expected_call, last_update_call)"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_f1f79656","line":4566,"updated":"2016-12-28 09:04:28.000000000","message":"ditto","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"8d62613927d623204e9f245baf6bae2ea554e2f4","unresolved":false,"context_lines":[{"line_number":4612,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":4613,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":4614,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":4615,"context_line":"                               \u0027tags\u0027])"},{"line_number":4616,"context_line":"        self.migration \u003d objects.Migration(context\u003dself.context.elevated(),"},{"line_number":4617,"context_line":"                                           new_instance_type_id\u003d7)"},{"line_number":4618,"context_line":"        self.migration.status \u003d \u0027migrating\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"da4df55a_1197baec","line":4615,"updated":"2016-12-28 09:04:28.000000000","message":"ditto","commit_id":"739118c9d4cf2edc477e47d4f81e6e17816e52cd"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"f844b4fcac72af28b217abcbd1105d73a1ec7905","unresolved":false,"context_lines":[{"line_number":3445,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3446,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3447,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3448,"context_line":"                               \u0027tags\u0027])"},{"line_number":3449,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3450,"context_line":"        self.injected_files \u003d []"},{"line_number":3451,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":36,"id":"bff0334d_e6282c35","line":3448,"updated":"2017-04-07 18:00:42.000000000","message":"alignment is off here","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"},{"author":{"_account_id":9708,"name":"Balazs Gibizer","display_name":"gibi","email":"gibizer@gmail.com","username":"gibi"},"change_message_id":"5cc64832c8c685e9cdd274e8b6c13a35c1bcc47a","unresolved":false,"context_lines":[{"line_number":3445,"context_line":"        self.instance \u003d fake_instance.fake_instance_obj(self.context,"},{"line_number":3446,"context_line":"                vm_state\u003dvm_states.ACTIVE,"},{"line_number":3447,"context_line":"                expected_attrs\u003d[\u0027metadata\u0027, \u0027system_metadata\u0027, \u0027info_cache\u0027,"},{"line_number":3448,"context_line":"                               \u0027tags\u0027])"},{"line_number":3449,"context_line":"        self.admin_pass \u003d \u0027pass\u0027"},{"line_number":3450,"context_line":"        self.injected_files \u003d []"},{"line_number":3451,"context_line":"        self.image \u003d {}"}],"source_content_type":"text/x-python","patch_set":36,"id":"7ffa3b31_cf950689","line":3448,"in_reply_to":"bff0334d_e6282c35","updated":"2017-04-20 15:39:35.000000000","message":"Done","commit_id":"0b137f270331247091107f6c385e8bf567dbea09"}],"nova/tests/unit/notifications/objects/test_notification.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fbb4dac6622d2fc4679043df389a3505d6f11f0","unresolved":false,"context_lines":[{"line_number":457,"context_line":"    @mock.patch(\u0027nova.notifications.objects.instance.\u0027"},{"line_number":458,"context_line":"                \u0027InstanceUpdateNotification._emit\u0027)"},{"line_number":459,"context_line":"    def test_send_version_instance_update_uses_flavor(self, mock_emit):"},{"line_number":460,"context_line":"        # instance.update notification needs some tags value"},{"line_number":461,"context_line":"        instance \u003d copy.deepcopy(self.instance)"},{"line_number":462,"context_line":"        instance.tags \u003d objects.TagList()"},{"line_number":463,"context_line":""}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_3a0c9f3f","line":460,"range":{"start_line":460,"start_character":8,"end_line":460,"end_character":60},"updated":"2017-04-20 22:46:28.000000000","message":"Do we need to do this here because otherwise it tries to lazy-load the tags field and blows up? Alternatively you can just mock out the nova.objects.Instance._load_tags method.","commit_id":"e0017ee7af60ebc23205dc752ce38756643d822b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"4fbb4dac6622d2fc4679043df389a3505d6f11f0","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                \u0027InstanceUpdateNotification._emit\u0027)"},{"line_number":459,"context_line":"    def test_send_version_instance_update_uses_flavor(self, mock_emit):"},{"line_number":460,"context_line":"        # instance.update notification needs some tags value"},{"line_number":461,"context_line":"        instance \u003d copy.deepcopy(self.instance)"},{"line_number":462,"context_line":"        instance.tags \u003d objects.TagList()"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        # Make sure that the notification payload chooses the values in"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_1a2c43aa","line":461,"range":{"start_line":461,"start_character":19,"end_line":461,"end_character":47},"updated":"2017-04-20 22:46:28.000000000","message":"This should probably use self.instance.obj_clone(). -1 for this, unless you just mock out _load_tags.","commit_id":"e0017ee7af60ebc23205dc752ce38756643d822b"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"a0bb06fcab54a3d2bed4a8e752e3b3fb09d1ae6a","unresolved":false,"context_lines":[{"line_number":458,"context_line":"                \u0027InstanceUpdateNotification._emit\u0027)"},{"line_number":459,"context_line":"    def test_send_version_instance_update_uses_flavor(self, mock_emit):"},{"line_number":460,"context_line":"        # instance.update notification needs some tags value"},{"line_number":461,"context_line":"        instance \u003d copy.deepcopy(self.instance)"},{"line_number":462,"context_line":"        instance.tags \u003d objects.TagList()"},{"line_number":463,"context_line":""},{"line_number":464,"context_line":"        # Make sure that the notification payload chooses the values in"}],"source_content_type":"text/x-python","patch_set":38,"id":"7ffa3b31_55dcdce2","line":461,"range":{"start_line":461,"start_character":19,"end_line":461,"end_character":47},"in_reply_to":"7ffa3b31_1a2c43aa","updated":"2017-04-20 23:37:55.000000000","message":"Actually we don\u0027t really need to deepcopy this, it will get recreated for the next test.","commit_id":"e0017ee7af60ebc23205dc752ce38756643d822b"}]}
