)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic RPC mechanism which could be reused"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a basic devrev document describing a publisher/subscriber"},{"line_number":10,"context_line":"messaging mechanism optimized for agent consumption and server"},{"line_number":11,"context_line":"production without the need of creating new rpc messages."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa32b979_97cd3a87","line":9,"updated":"2015-06-17 14:46:59.000000000","message":"devref","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Generic RPC mechanism which could be reused"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a basic devrev document describing a publisher/subscriber"},{"line_number":10,"context_line":"messaging mechanism optimized for agent consumption and server"},{"line_number":11,"context_line":"production without the need of creating new rpc messages."},{"line_number":12,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa32b979_e7494232","line":9,"in_reply_to":"fa32b979_97cd3a87","updated":"2015-06-18 12:05:53.000000000","message":"whoops.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d7dac6ece440bd220aa95f7ddddb3f2c51dccac","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a basic devrev document describing a publisher/subscriber"},{"line_number":10,"context_line":"messaging mechanism optimized for agent consumption and server"},{"line_number":11,"context_line":"production without the need of creating new rpc messages."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Oslo versionedobjects seems like the perfect match to ensure"},{"line_number":14,"context_line":"cross version compatibility even if the published/subscribed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa32b979_095a31f2","line":11,"updated":"2015-06-18 16:54:23.000000000","message":"Here you got me intrigued: \u0027Generic RPC mechanism without the need of creating new rpc messages\u0027. It sounds like magic!\n\nYou achieved the nirvana of the perfect author: get the reader to continue reading :)","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This is a basic devrev document describing a publisher/subscriber"},{"line_number":10,"context_line":"messaging mechanism optimized for agent consumption and server"},{"line_number":11,"context_line":"production without the need of creating new rpc messages."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Oslo versionedobjects seems like the perfect match to ensure"},{"line_number":14,"context_line":"cross version compatibility even if the published/subscribed"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa32b979_d67044df","line":11,"in_reply_to":"fa32b979_095a31f2","updated":"2015-06-19 10:19:57.000000000","message":"ROFL. \n\nWell, to make this, of course, we need new RPC messages, then afterwards we can build on them without new RPC messages when we\u0027re consuming these kind of resources from agent.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":24,"context_line":"TODO: Update documentation, according to code changes,"},{"line_number":25,"context_line":"      enforce versioned objects only doing deserial/serialization."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"Co-Authored-By: Miguel Angel Ajo \u003cmangelajo@redhat.com\u003e"},{"line_number":28,"context_line":"Co-Authored-By: Eran Gampel \u003ceran@gampel.net\u003e"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"Change-Id: I524cf5a14e99dc6bee4d4261557d98c75efa0809"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"ba3cc151_49e08429","line":27,"updated":"2015-07-01 17:54:23.000000000","message":"since Miguel the author, he should not be listed here as co-author","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"}],"doc/source/devref/rpc_callbacks.rst":[{"author":{"_account_id":8976,"name":"shihanzhang","email":"ayshihanzhang@gmail.com","username":"shihanzhang"},"change_message_id":"76cec64b931fe1caf049ca5af523d312942befec","unresolved":false,"context_lines":[{"line_number":11,"context_line":"profiles over ports or network resources."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1af86dd1_311ac36f","line":14,"updated":"2015-06-12 07:30:49.000000000","message":"I very like this idea","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"82ef10a2e0b3b15c643d769037db3919c3425446","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    from neutron.rpc_resources import registry"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_lis):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_95c6b666","line":34,"updated":"2015-06-16 21:11:54.000000000","message":"Is \"lis\" a common abbreviation or should this be \"resource_list\"?","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"acfe0aa9281b4f240e6a6f0f8a2399e3fa9cdbe6","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    from neutron.rpc_resources import registry"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_lis):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_e3bf3da8","line":34,"in_reply_to":"fa32b979_95c6b666","updated":"2015-06-17 06:49:18.000000000","message":"Sorry, typo :)\nWill fix, thanks","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"81c4d8bb48719320272d0135f2f82ae54adf23e3","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    from neutron.rpc_resources import registry"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_lis):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_cf6017d2","line":34,"in_reply_to":"fa32b979_e3bf3da8","updated":"2015-06-17 09:43:38.000000000","message":"Done","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"aa8e8cffecb4b511b0e4c8b574be123a2cf9a2b1","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_76812a8f","line":42,"updated":"2015-06-14 05:46:30.000000000","message":"it may be useful to be able to register based on port_uuid as well","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"81c4d8bb48719320272d0135f2f82ae54adf23e3","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_2f68a3b8","line":42,"in_reply_to":"fa32b979_4409cc94","updated":"2015-06-17 09:43:38.000000000","message":"Done","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"78da43f4335a238e941dcb91bad9c6d3ee5abd90","unresolved":false,"context_lines":[{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_4409cc94","line":42,"in_reply_to":"fa32b979_76812a8f","updated":"2015-06-14 10:04:59.000000000","message":"For core resources, may be we could automatically subscribe the general callbacks for ports, subnets, etc... and make updates to those available via RPC too.\n\nI\u0027d like to see a clear interface (parameters) via versioned objects so we don\u0027t depend on object/dict version understanding of each RPC end.\n\nIt\u0027d a very good idea btw. :)","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"aa8e8cffecb4b511b0e4c8b574be123a2cf9a2b1","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"},{"line_number":48,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_profile_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_96906eee","line":50,"updated":"2015-06-14 05:46:30.000000000","message":"callback\u003dprocess-resource_update)?","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"917f0156bbcddc33ec64c8da4bb72143d6a9bf6f","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"},{"line_number":48,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_profile_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"1af86dd1_e3a9f3e0","line":50,"updated":"2015-06-12 15:01:32.000000000","message":"qos_profile_id is qos_policy_id? or did I missed something...","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"78da43f4335a238e941dcb91bad9c6d3ee5abd90","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"},{"line_number":48,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_profile_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_e4fd806f","line":50,"in_reply_to":"1af86dd1_e3a9f3e0","updated":"2015-06-14 10:04:59.000000000","message":"Correct qos_policy_id, thanks.","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"81c4d8bb48719320272d0135f2f82ae54adf23e3","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"},{"line_number":48,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_profile_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_efb4fb35","line":50,"in_reply_to":"fa32b979_0403c474","updated":"2015-06-17 09:43:38.000000000","message":"Done","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"78da43f4335a238e941dcb91bad9c6d3ee5abd90","unresolved":false,"context_lines":[{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"},{"line_number":48,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_profile_id)"},{"line_number":51,"context_line":""},{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_0403c474","line":50,"in_reply_to":"fa32b979_96906eee","updated":"2015-06-14 10:04:59.000000000","message":"correct :-)","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":7776,"name":"Paul Carver","email":"pcarver@att.com","username":"pcarver"},"change_message_id":"82ef10a2e0b3b15c643d769037db3919c3425446","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def cleaup_subscriptions()"},{"line_number":56,"context_line":"        sg_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":57,"context_line":"        qos_profile_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":58,"context_line":"        registry.unsubscribe_info(resource.SG_RULES, sg_ids)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_d57e7e18","line":55,"updated":"2015-06-16 21:11:54.000000000","message":"typo: cleaup -\u003e cleanup","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"81c4d8bb48719320272d0135f2f82ae54adf23e3","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def cleaup_subscriptions()"},{"line_number":56,"context_line":"        sg_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":57,"context_line":"        qos_profile_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":58,"context_line":"        registry.unsubscribe_info(resource.SG_RULES, sg_ids)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_6f5b0bf7","line":55,"in_reply_to":"fa32b979_83df510c","updated":"2015-06-17 09:43:38.000000000","message":"Done","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"acfe0aa9281b4f240e6a6f0f8a2399e3fa9cdbe6","unresolved":false,"context_lines":[{"line_number":52,"context_line":"        cleanup_subscriptions()"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"    def cleaup_subscriptions()"},{"line_number":56,"context_line":"        sg_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":57,"context_line":"        qos_profile_ids \u003d determine_unreferenced_sg_ids()"},{"line_number":58,"context_line":"        registry.unsubscribe_info(resource.SG_RULES, sg_ids)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_83df510c","line":55,"in_reply_to":"fa32b979_d57e7e18","updated":"2015-06-17 06:49:18.000000000","message":"\u0027\u0027:D thanks :D","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"aa8e8cffecb4b511b0e4c8b574be123a2cf9a2b1","unresolved":false,"context_lines":[{"line_number":69,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":70,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"  registry.subscribe(callback2, resources.ROUTER_GATEWAY, events.BEFORE_UPDATE)"},{"line_number":73,"context_line":"  print \u0027Subscribed\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_76aa8a1b","line":72,"updated":"2015-06-14 05:46:30.000000000","message":"is this related or just left overs?","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"81c4d8bb48719320272d0135f2f82ae54adf23e3","unresolved":false,"context_lines":[{"line_number":69,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":70,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"  registry.subscribe(callback2, resources.ROUTER_GATEWAY, events.BEFORE_UPDATE)"},{"line_number":73,"context_line":"  print \u0027Subscribed\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_0f759f62","line":72,"in_reply_to":"fa32b979_76aa8a1b","updated":"2015-06-17 09:43:38.000000000","message":"Done","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"78da43f4335a238e941dcb91bad9c6d3ee5abd90","unresolved":false,"context_lines":[{"line_number":70,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"  registry.subscribe(callback2, resources.ROUTER_GATEWAY, events.BEFORE_UPDATE)"},{"line_number":73,"context_line":"  print \u0027Subscribed\u0027"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":""},{"line_number":76,"context_line":"Sending resource updates"}],"source_content_type":"text/x-rst","patch_set":1,"id":"fa32b979_2404c87c","line":73,"updated":"2015-06-14 10:04:59.000000000","message":"left overs :), it\u0027s based on amax work for callbacks.","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"60538a57e57d1e4d524594445e9b92b8d2c6f251","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def send_rpc_updates_on_qos_profile(qos_profile_id):"},{"line_number":92,"context_line":"        rules \u003d get_qos_profile_rules(qos_profile_id)"},{"line_number":93,"context_line":"        rpc_registry.notify(resource.QOS_RULES, qos_profile_id, rules)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"3afb71cf_be10d059","line":93,"updated":"2015-06-11 13:30:57.000000000","message":"Still stuff that needs to be sorted out in this idea:\n\nIf server is restarted... we may need to notify agents to resubscribe the information they need... or otherwise they\u0027ll keep waiting on nothing.","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"6c116b45f482804f32912b5d844beafbd35d3462","unresolved":false,"context_lines":[{"line_number":90,"context_line":""},{"line_number":91,"context_line":"    def send_rpc_updates_on_qos_profile(qos_profile_id):"},{"line_number":92,"context_line":"        rules \u003d get_qos_profile_rules(qos_profile_id)"},{"line_number":93,"context_line":"        rpc_registry.notify(resource.QOS_RULES, qos_profile_id, rules)"}],"source_content_type":"text/x-rst","patch_set":1,"id":"1af86dd1_91261715","line":93,"in_reply_to":"3afb71cf_be10d059","updated":"2015-06-12 07:48:40.000000000","message":"Sorry, I think my comment above makes no sense :) I must start trying fanout queues to understand them in full ;)\n\nThanks shihanzhang for the IRC clarifications to my questions.","commit_id":"fbcc8a81959b73dd191d132363d7f6bb1a223dc8"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d7dac6ece440bd220aa95f7ddddb3f2c51dccac","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Neutron Messaging Callback System"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"In Neutron, agents may need to subscribe to specific resource details which"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_4c660752","line":2,"updated":"2015-06-18 16:54:23.000000000","message":"I\u0027d like to position this in relation to the callback registry mechanism for in-process communication.\n\nSo, if I understand you correctly, your proposal the is to extend the registry callback mechanism so that you can dispatch and subscribe events not just amongst objects intra-process but inter-process too.\n\nDid I get it right?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Neutron Messaging Callback System"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"In Neutron, agents may need to subscribe to specific resource details which"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_713942d8","line":2,"in_reply_to":"fa32b979_4c660752","updated":"2015-06-19 10:19:57.000000000","message":"Not exactly, this is a suggestion done by Irena to extend this. And I guess it makes a lot of sense. But, here I\u0027m talking about subscribing to other resources (sometimes belonging to ports, networks, etc) with more granularity. \n\nSo we don\u0027t need to send the whole blob even  if the agent is only going to consume a bit.\n\nBut it\u0027s of course, another approach we can look at, probably it could make sense to not have so much granularity in favor of simplicity, but keep reading to see if I make sense:\n\n\nTo put this on the context of QoS:\n\nupdate_port on the agent would receive the basic port information, containing also the qos_profile_id where it\u0027s associated.\n\n\nIn such case, the agent would subscribe to such qos_profile_id, and at the same time get the complete info of such id.\n\nThis has the advantage, that, for example, if you update rules in a profile, you don\u0027t need to flood agents per-port (50 ports \u003d 50 updates), but instead you only get one update (to the specific qos-profile-id), via fanout, which is very cheap in terms of neutron-server processing and messaging.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5e54a1afa8e8fdbcb620a2e183dc3bbf0e8dd2bd","unresolved":false,"context_lines":[{"line_number":1,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":2,"context_line":"Neutron Messaging Callback System"},{"line_number":3,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"In Neutron, agents may need to subscribe to specific resource details which"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_84c0342c","line":2,"in_reply_to":"fa32b979_713942d8","updated":"2015-06-19 15:45:48.000000000","message":"OK. Either way it would be useful to put this solution into a \u0027compare and contrast\u0027 context with the other registry mechanism, so that developers know which one to pick for their needs.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d7dac6ece440bd220aa95f7ddddb3f2c51dccac","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_4c6927f8","line":15,"updated":"2015-06-18 16:54:23.000000000","message":"If I got your initial plan right, it sounds to me that this is somewhat what already implicitly happen when agents register to the message bus. The difference is that the agent really becomes \u0027subscribed\u0027 for its entire lifecycle.\n\nAm I barking up at the wrong tree?\n\nAre you suggesting that now within the same agent process space (e.g. the agent) we\u0027ll have potentially multiple RPC subscribers to the same resource event (dispatched by a remote notifier)?\n\nYou may be onto something, but I am not clear how this would be applied in practice or how clean it is going to be.\n\nAnother potential communication mechanism that I was thinking of would be along the following lines:\n\nImagine a courier service.This courier advertises a \u0027route\u0027 and a \u0027package\u0027. For instance it says: \u0027I am going to destination X and I am bringing package Y with me\u0027. Then the courier says: \u0027Is there anyone interested in adding something to Y so that I\u0027ll take it over to X?\u0027\n\nPeople come and say: \u0027Yes, I have Y.a, another say, I have Y.b\u0027. The courier assembles all the Y.? and starts its journey, and gets to destination X. We can make the advertisement process as complicated as we like, but for now a single destination would suffice (for sake of clarity).\n\nNow that the courier is in X, it can say: \u0027Hey I have package Y, and I have some smaller bits with me. Is there anyone interested in Y.a? Please come and get it! Is there anyone interested in Y.b? Please come and get it!...etc\n\nAm I making any sense?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26091a44d47ba912ea9d1ce78ccdc644689a6e41","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_ffb98d7a","line":15,"in_reply_to":"fa32b979_2417e855","updated":"2015-06-19 15:58:40.000000000","message":"Yes, embedding version information should help. I was thinking of a simple fallback mechanism for agents (I hope VO can help on that):\n\n1) server sends the object data serialized by VO into a certain VO version, version goes attached\n2) agents receive it... if they need an older version, they use an rpc method to get the lowered-version.\n\nWe could be smarter at 2, and instead of using RPC, we could just: \na) include a message id in 1\nb) send the lowered version via fanout, with the ID, and making it clear which is a lowered version fanout... so all agents will receive it.\n\nsubsequent requests for \"lowered version message\" for the same ID are ignored.\n\n\neventually agents get updated to new versions and stop asking for older versions of the payload.\n\nYou don\u0027t dream, I guess  we can make a good RPC cleanup here, and make things cleaner to extend in the future.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_71dce274","line":15,"in_reply_to":"fa32b979_4c6927f8","updated":"2015-06-19 10:19:57.000000000","message":"\u003e If I got your initial plan right, it sounds to me that this is somewhat what already implicitly happen when agents register to the message bus. The difference is that the agent really becomes \u0027subscribed\u0027 for its entire lifecycle.\n\nYes, they get registered for port_updates, but then, they need to go back with rpc calls for port details every time there\u0027s an update. Or have specific server-\u003eagent calls like security groups do.\n\n\u003e Are you suggesting that now within the same agent process space (e.g. the agent) we\u0027ll have potentially multiple RPC subscribers to the same resource event (dispatched by a remote notifier)?\n\nThe general use case will be only one subscriber. But nothing prevents several subscribers, the fanout message, btw should only happen once, and then it\u0027s dispatched within agent to the callbacks.\n\n\n----\n\nAbout the idea you had, I guess we can extend the design to allow that, so, if there are more sources able to extend the resource details which will be sent to the RPC consumer, then they can add the details one after another.\n\nIn fact, as you said and Irena suggested, this library can also (or *simply*) act as a simple remote gateway to the generic in-process callback mechanism you already designed.\n\nThat would be much simpler in terms of implementations, we let publishers register to the normal in-process, callback, and then the remote RPC framework just takes care of propagating that. My concern about this, is stability of the interfaces, may be we can jump into this when we\u0027re able to pass versionedobjects for such resources within the callbacks, so we\u0027re somehow safe about versioning issues over RPC. Versioning and this design needs exploration.\n\nIf we\u0027re propagating versioned objects, for example, and an object is sent in an incompatible version over fanout, we can provide an fallback RPC to server, to get an older version of the object (I have a very high level understanding of VOs yet... I need to get my hands dirty to make sure what I\u0027m saying is not bullshit...), this would help during upgrades and mismatches of VO\u0027s versioning across server/agent.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3877ca8a301c76846e14a571cb185d6a97b55f3c","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_7cf7d98c","line":15,"in_reply_to":"fa32b979_71dce274","updated":"2015-06-19 10:39:46.000000000","message":"Yeah, this piling stuff that can be potentially interesting into a single message leads directly to vague versioning for RPC. I would not go that far with Armando\u0027s courier metaphor.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5e54a1afa8e8fdbcb620a2e183dc3bbf0e8dd2bd","unresolved":false,"context_lines":[{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Using a remote publisher/subscriber pattern, the information about such"},{"line_number":14,"context_line":"resources could be published using fanout queues to all interested nodes,"},{"line_number":15,"context_line":"minimizing messaging requests from agents to server."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_2417e855","line":15,"in_reply_to":"fa32b979_7cf7d98c","updated":"2015-06-19 15:45:48.000000000","message":"I would believe that if we settle on the mechanism to send data over the wire (i.e. the courier\u0027s journey), then we\u0027d need to figure out a way to standardize the various payload formats. We could embed version information into each payload extension, so that the receiving end knows how to pick. I would imagine that the complication may arise if we need to propagate the \u0027same\u0027 object in its different versions, but wouldn\u0027t this be a problem that we\u0027d have regardless?\n\nThat said, I really think that we should try and simplify the mess that we got for the communication server/agent: it\u0027s unpredictable, difficult to extend, chatty...you name it. This objective, coupled with the ability to have multiple in-process parties cooperate on the same piece of resource, and I think we\u0027ll have a killer solution!\n\n/me dreams","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_428e0e7a","line":19,"updated":"2015-06-17 14:46:59.000000000","message":"I was pointed out lately that oslo.messaging does not send version information on the wire, meaning oslo.versionedobjects do not really convert between versions on demand. Instead, a version is pinned during upgrade to a well known (\u003dold) version, and then all communication with old agents run using that old version. Converters are used to get that old version from new objects server-side.\n\nSo in essense, there is no magic on the wire. I think we may eventually get version put on the wire and then convert on demand, but that\u0027s just dreams for now.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_8c92ddf4","line":19,"in_reply_to":"fa32b979_428e0e7a","updated":"2015-06-18 12:05:53.000000000","message":"Aha, but it still seems to gives us compatibility with old agents.\n\nHow does it then now that an old agent is calling for the information?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3877ca8a301c76846e14a571cb185d6a97b55f3c","unresolved":false,"context_lines":[{"line_number":16,"context_line":""},{"line_number":17,"context_line":"Additionally, if we leveraged oslo.versionedobjects capabilities to serialize"},{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_3c1f11b9","line":19,"in_reply_to":"fa32b979_8c92ddf4","updated":"2015-06-19 10:39:46.000000000","message":"That is something I still should dive in.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d7dac6ece440bd220aa95f7ddddb3f2c51dccac","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_cf38c9d5","line":21,"updated":"2015-06-18 16:54:23.000000000","message":"Have you considered abstracting this description from the specifics (e.g. SecurityGroup and/or QoS)","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26091a44d47ba912ea9d1ce78ccdc644689a6e41","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_df3929f4","line":21,"in_reply_to":"fa32b979_1f2551ad","updated":"2015-06-19 15:58:40.000000000","message":"I will try to clarify the workflow on the next PS and, If I know how... add an abstracted example, I hope that will help.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"5e54a1afa8e8fdbcb620a2e183dc3bbf0e8dd2bd","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_1f2551ad","line":21,"in_reply_to":"fa32b979_31765a07","updated":"2015-06-19 15:45:48.000000000","message":"ok, let\u0027s try with the specific example, however I am still having a hard time following the actual workflow. I\u0027ll read it once again.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":18,"context_line":"and deserialize objects we could easily make them version independent across"},{"line_number":19,"context_line":"model updates and agent versions."},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_31765a07","line":21,"in_reply_to":"fa32b979_cf38c9d5","updated":"2015-06-19 10:19:57.000000000","message":"What do you mean? It was my intention to make it abstract, but probably the examples make it look like the oposite. I was trying to provide specific usage examples.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"4d7dac6ece440bd220aa95f7ddddb3f2c51dccac","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"},{"line_number":25,"context_line":"associated SG-A, and QoS-policy-A uuids both."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"At that moment, the agent may subscribe:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_acea33d9","line":24,"updated":"2015-06-18 16:54:23.000000000","message":"where is this handle coming from?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":21,"context_line":"Subscribing to resources"},{"line_number":22,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"Imagine that you have agent A, which just got to handle a new port, which has"},{"line_number":25,"context_line":"associated SG-A, and QoS-policy-A uuids both."},{"line_number":26,"context_line":""},{"line_number":27,"context_line":"At that moment, the agent may subscribe:"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_d15dae7a","line":24,"in_reply_to":"fa32b979_acea33d9","updated":"2015-06-19 10:19:57.000000000","message":"Sorry, those handles are UUIDs, for example the qos_profile_id received on a port_update, or the security_groups field received in a port update.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"72aadfbecb5cc017b972683ed5cd5acf720610c4","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_list):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_d3fdddb1","line":35,"updated":"2015-06-18 14:18:15.000000000","message":"this is how plan to use the callback\n        #(moshele) create new function with known self  and port  parameters \n        process_policy_callback \u003d functools.partial(self._process_policy_updates, self, port)\n        process_rules_callback  \u003d functools.partial(self._process_rules_updates, self, port)\n        #(moshele) - register to the qos resources for next updates (update/delete)\n        qos_policy_id \u003d registry.get_info(resources.QOS_POCLICY, port[\u0027id\u0027],\n                                      callback\u003dprocess_policy_callback)  \n        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_policy_id,\n                                      callback\u003dprocess_rules_callback)\n        \n        #(moshele) - trigger the callback manually because the create event already\n        # happened \n        self._process_policy_updates(port, CREATE, qos_policy_id)\n        self._process_rules_updates(resources.QOS_RULES, qos_rules)\n            \n    def _process_rules_updates(self, port, action_type, qos_rules):\n        for qos_rule in qos_rules:\n            getattr(self.qos_driver, action_type)(port, qos_rule)\n\n    def _process_policy_updates(self, port, action_type, qos_rules):\n        pass\n\nso It seem to me that the prototype of the callback should be \nprocess_resource_updates(action_type, resource_list)","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"4af04bc9d1168d0acbba87ee1e15aedefa08dfc2","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_list):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_a291b354","line":35,"in_reply_to":"fa32b979_1cf24d70","updated":"2015-06-19 12:31:47.000000000","message":"Yes, in get_info I return the current status, and subscribe, we\u0027re considering to split that to two functions, but then caller should do it in the right order.\n\nsubscribe, then get_info, because get_info / subscribe can lead to race conditions where you miss updates int he middle.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3877ca8a301c76846e14a571cb185d6a97b55f3c","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_list):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_1cf24d70","line":35,"in_reply_to":"fa32b979_31fbba49","updated":"2015-06-19 10:39:46.000000000","message":"@Miguel, but you should also return data you\u0027ve subscribed to from get_info(), so that the subscriber can proceed with it. Otherwise you wait for updates while you don\u0027t yet have full synced picture. It seems wrong.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def process_resource_updates(resource_type, resource_id, resource_list):"},{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_31fbba49","line":35,"in_reply_to":"fa32b979_d3fdddb1","updated":"2015-06-19 10:19:57.000000000","message":"no qos_policy_id will come in the port dictionary from server (or that\u0027s what I expect), and then you just subscribe to the QOS_POLICY_RULES, port[\u0027qos_policy_id\u0027]","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"7af3420d05292e8d0567902ffca1c91c827f86e7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_98b3269a","line":38,"updated":"2015-06-17 16:04:54.000000000","message":"how do you plane to handle delete resource?\nI am assuming that when a port is deleted the agent need to remove all Qos rules from the interface.\nshouldn\u0027t  you provide that action type that trigger it?(created/updated/deleted)\nso that the callback will handle it properly.\n\nAlso who will do the unsubscribe? can it done automatically by this mechanism when the action is delete.  This way I don\u0027t need to unsubscribe in the QosAgent...\n\nwhat is resource_list? is it just list of the resource  attributes and values?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"38c25a78fe10f15331b4d215b3a5cf65ed539b10","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_df4886b5","line":38,"in_reply_to":"fa32b979_873396f5","updated":"2015-06-18 13:22:55.000000000","message":"Once core resource is deleted, it does not make sense to keep subscriptions to this object. But the notification regarding object deletion should be sent out. I wonder if there maybe some case that this notification is lost and was not handled by agent. This maybe the questions to the agent side implementation ref.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":35,"context_line":"        ..."},{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_873396f5","line":38,"in_reply_to":"fa32b979_98b3269a","updated":"2015-06-18 12:05:53.000000000","message":"Correct, delete is an important action, we must pass the action type, or provide a delete callback.\n\nWe could definitely unsubscribe at delete, since there won\u0027t be more updates.\n\nBut still, you also need to unsubscribe when all of your ports referring a \"profile id\" are removed, ... we could do that lazily, for example, if we receive an update to a profile, and we have no port for it.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"98facd3eef98937379155d5b12a25b9cca404e59","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_b12878e3","line":39,"updated":"2015-06-17 20:56:44.000000000","message":"also how to you plan handle failure of the callback?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"11d1947a29370e55ddacc5bd474d35da6e1b783d","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_cd4e9f3a","line":39,"in_reply_to":"fa32b979_0756a605","updated":"2015-06-18 12:48:15.000000000","message":"just to verify \nwhen I am in the callback and the  QosDriver failed to apply the qos rule should I throw exception for you to handle or I need to handle it inside the callback.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_0756a605","line":39,"in_reply_to":"fa32b979_b12878e3","updated":"2015-06-18 12:05:53.000000000","message":"What do you mean?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"38c25a78fe10f15331b4d215b3a5cf65ed539b10","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_9ff43e5b","line":39,"in_reply_to":"fa32b979_cd4e9f3a","updated":"2015-06-18 13:22:55.000000000","message":"Good question. In my opinion it\u0027s not responsibility of PUB/SUB mechanism. I guess we can discuss it at agent WIP patch","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":36,"context_line":"        send to the right handler which will update any control plane"},{"line_number":37,"context_line":"        details related to the updated resource..."},{"line_number":38,"context_line":""},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"    def port_update(...):"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_3f0e52e5","line":39,"in_reply_to":"fa32b979_cd4e9f3a","updated":"2015-06-19 10:19:57.000000000","message":"It\u0027s a very good question.\n\nI guess a generic form of throw exception / the callback catches and reports back to neutron, would be ideal, but then, we don\u0027t have information about which port exactly failed.\n\nI\u0027d say, that at least for now, we handle it in callback, and do as we should (report port failed, or whatever we decide to do)..","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_5de03396","line":44,"updated":"2015-06-17 14:46:59.000000000","message":"what does it return? is it the function to register for updates?\n\nIf it is, we should make sure it first subscribes, then does the initial fetch, otherwise we may miss some updates.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_d115ae49","line":44,"in_reply_to":"fa32b979_359e7107","updated":"2015-06-19 10:19:57.000000000","message":"That could make sense, (from the code point of view), but I\u0027d keep it to only one fanout queue for resource+id, then the routing can be done to different callbacks by the library on agent side.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"38c25a78fe10f15331b4d215b3a5cf65ed539b10","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_5f6f96fb","line":44,"in_reply_to":"fa32b979_52d30e60","updated":"2015-06-18 13:22:55.000000000","message":"+1","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_a7457a43","line":44,"in_reply_to":"fa32b979_5de03396","updated":"2015-06-18 12:05:53.000000000","message":"it returns the current rules for sg_id (got first via an RPC call to plugin).","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"72aadfbecb5cc017b972683ed5cd5acf720610c4","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_359e7107","line":44,"in_reply_to":"fa32b979_5f6f96fb","updated":"2015-06-18 14:18:15.000000000","message":"also I think in the  subscribe  method I should pass the actions_types I want to subscribe to","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"11d1947a29370e55ddacc5bd474d35da6e1b783d","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_52d30e60","line":44,"in_reply_to":"fa32b979_a7457a43","updated":"2015-06-18 12:48:15.000000000","message":"I think it will be better to break it to 2 api \nsubscribe api and get info api","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"e5e02941b11d58dc0f9a2da29684b5385605cc1f","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        ..."},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"        sg_rules \u003d registry.get_info(resources.SG_RULES, sg_id,"},{"line_number":45,"context_line":"                                     callback\u003dprocess_resource_updates)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        sg_members \u003d registry.get_info(resources.SG_MEMBERS, sg_id,"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_b59836c1","line":44,"in_reply_to":"fa32b979_d115ae49","updated":"2015-06-25 10:07:38.000000000","message":"Done: split in two function calls.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                                       callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_policy_id,"},{"line_number":51,"context_line":"                                      callback\u003dprocess_resource.updates)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        cleanup_subscriptions()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_bdce1f2b","line":51,"updated":"2015-06-17 14:46:59.000000000","message":". \u003d\u003e _","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"e5e02941b11d58dc0f9a2da29684b5385605cc1f","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                                       callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_policy_id,"},{"line_number":51,"context_line":"                                      callback\u003dprocess_resource.updates)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        cleanup_subscriptions()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_95b2d247","line":51,"in_reply_to":"fa32b979_27a72a0c","updated":"2015-06-25 10:07:38.000000000","message":"Done","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":48,"context_line":"                                       callback\u003dprocess_resource_updates)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_policy_id,"},{"line_number":51,"context_line":"                                      callback\u003dprocess_resource.updates)"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"        cleanup_subscriptions()"},{"line_number":54,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_27a72a0c","line":51,"in_reply_to":"fa32b979_bdce1f2b","updated":"2015-06-18 12:05:53.000000000","message":"Correct, thanks.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"522630a76a1ecfd70e8f04324fe083c823251d36","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        registry.unsubscribe_info(resource.QOS_RULES, qos_policy_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"Another unsubscription strategy could be to lazily unsubscribe resources when"},{"line_number":64,"context_line":"we receive updates for them, and we discover that they are not needed anymore."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_da7f77a9","line":64,"updated":"2015-06-17 10:20:54.000000000","message":"What happens if  resource was deleted? I guess it can be part of the mechanism to remove subscriptions for deleted resource","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        registry.unsubscribe_info(resource.QOS_RULES, qos_policy_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"Another unsubscription strategy could be to lazily unsubscribe resources when"},{"line_number":64,"context_line":"we receive updates for them, and we discover that they are not needed anymore."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_48606fcf","line":64,"in_reply_to":"fa32b979_da7f77a9","updated":"2015-06-17 14:46:59.000000000","message":"@Irena, you mean, a cleanup callback is called and then it\u0027s auto-unsubscribed?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":61,"context_line":"        registry.unsubscribe_info(resource.QOS_RULES, qos_policy_id)"},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"Another unsubscription strategy could be to lazily unsubscribe resources when"},{"line_number":64,"context_line":"we receive updates for them, and we discover that they are not needed anymore."},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_47858e57","line":64,"in_reply_to":"fa32b979_da7f77a9","updated":"2015-06-18 12:05:53.000000000","message":"Correct, as moshele said, I think we all agree.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"522630a76a1ecfd70e8f04324fe083c823251d36","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"},{"line_number":68,"context_line":"events, for example."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Unsubscribing to resources"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_75719ca7","line":68,"updated":"2015-06-17 10:20:54.000000000","message":"In such case, what will be notification that agent receives? It should always register on resource type to be able to get the resource id? I thinks there is no problem with such approach, just want to make sure I follow your intention.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"38c25a78fe10f15331b4d215b3a5cf65ed539b10","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"},{"line_number":68,"context_line":"events, for example."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Unsubscribing to resources"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_3f43b26d","line":68,"in_reply_to":"fa32b979_07f22606","updated":"2015-06-18 13:22:55.000000000","message":"Great","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"26375aea04f30eb589d818acf5112642b00ef192","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"},{"line_number":68,"context_line":"events, for example."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Unsubscribing to resources"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_7c403936","line":68,"in_reply_to":"fa32b979_3f43b26d","updated":"2015-06-19 10:19:57.000000000","message":"As I was commenting above to @armax, I believe this could be risky without proper objects, callback arguments, etc.. we should think on the consequences of versioning here.\n\nBut it\u0027s a valuable idea and we could extend on such direction when/if needed.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"NOTE(irenab): this could be extended to core resources like ports, making use"},{"line_number":67,"context_line":"of the standard neutron callbacks at server side and propagating AFTER_UPDATE"},{"line_number":68,"context_line":"events, for example."},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"Unsubscribing to resources"},{"line_number":71,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_07f22606","line":68,"in_reply_to":"fa32b979_75719ca7","updated":"2015-06-18 12:05:53.000000000","message":"It should register on PORT + \u003cport-id\u003e and then it\u0027d receive all updates to such port.\n\nor NET + \u003cnet-id\u003e ,\n\nSUBNET + \u003csubnet-id\u003e","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_e2b2c2e4","line":75,"updated":"2015-06-17 14:46:59.000000000","message":"why \u0027info\u0027? Maybe unsubscribe_resource_id?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"3877ca8a301c76846e14a571cb185d6a97b55f3c","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_7c24b9c5","line":75,"in_reply_to":"fa32b979_07c9c6ab","updated":"2015-06-19 10:39:46.000000000","message":"I think we should split it in two functions, as suggested above.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"4af04bc9d1168d0acbba87ee1e15aedefa08dfc2","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_82a26f99","line":75,"in_reply_to":"fa32b979_7c24b9c5","updated":"2015-06-19 12:31:47.000000000","message":"yes, let\u0027s do it that way.\n\nFunctions that do several things tend to be awkward.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":72,"context_line":""},{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_07c9c6ab","line":75,"in_reply_to":"fa32b979_e2b2c2e4","updated":"2015-06-18 12:05:53.000000000","message":"yes, that makes sense.\n\nMay be we should also change get_info to:\n\nsubscribe_resource_id(resource_type, resource_id, get_info\u003dTrue)  ?\n\nor asume we always  want the current state of the resource as we subscribe.","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"114fa3fbb9925fa0d90ab8a0103d13ad115078ff","unresolved":false,"context_lines":[{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_28896b75","line":76,"updated":"2015-06-17 14:46:59.000000000","message":"...resource_type?","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"242183738a580be9b6e815e08d752c352e1f65a7","unresolved":false,"context_lines":[{"line_number":73,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":74,"context_line":""},{"line_number":75,"context_line":"* unsubscribe_info(): it selectively unsubscribes an specific resource + id."},{"line_number":76,"context_line":"* unsubscribe_resource(): it unsubscribes from an specific resource, any ID."},{"line_number":77,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":78,"context_line":""},{"line_number":79,"context_line":""}],"source_content_type":"text/x-rst","patch_set":2,"id":"fa32b979_e7c2a284","line":76,"in_reply_to":"fa32b979_28896b75","updated":"2015-06-18 12:05:53.000000000","message":"+1","commit_id":"d53ab1d2c68335be292775de79222046f5a8f025"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Within an agent, there could be multiple subscribers to the same resource"},{"line_number":29,"context_line":"events, the resources updates would be dispatched to the subscribers from"},{"line_number":30,"context_line":"a single message."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"This publishing/subscription mechanism is highly dependent on the format"},{"line_number":33,"context_line":"of the resources passed around. This is why the library only allows"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_4f5d4e78","line":30,"updated":"2015-06-26 16:42:28.000000000","message":"could you clarify the \"multiple subscribers to the same resource events in the same agent\"? Are you implying that the oslo messaging library in that agent could receive multiple registrations requests from the agent code on the same topic?","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"Within an agent, there could be multiple subscribers to the same resource"},{"line_number":29,"context_line":"events, the resources updates would be dispatched to the subscribers from"},{"line_number":30,"context_line":"a single message."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"This publishing/subscription mechanism is highly dependent on the format"},{"line_number":33,"context_line":"of the resources passed around. This is why the library only allows"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cb67f2e8","line":30,"in_reply_to":"fa32b979_4f5d4e78","updated":"2015-06-28 07:01:58.000000000","message":"Correct, on the agent, one module could subscribe to SG_RULES, uuid-a, and another module could do the same, but, there would be a single (oslo messaging) topic registration (handled by the library), a single message reception (per resource update), and a single deserialisation.. then the library would go over all the registered callbacks and send the resource updates.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":37,"context_line":"obj_to_primitive(target_version\u003d..) and primitive_to_obj() #[ov_serdes]_"},{"line_number":38,"context_line":"methods is used internally to convert/retrieve objects before/after messaging."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Considering rolling upgrades, there are several scenarios to look at:"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"* publisher (generally neutron-server or a service) and subscriber (agent)"},{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_afa89a21","line":40,"updated":"2015-06-26 16:42:28.000000000","message":"One important requirements to specify here is how many versions do you allow to coexist in a cloud at any time.\nI assume it would be 2 but it is worth specifying explicitly.\nOther important points:\n- what upgrade span do you support, do you for example only support a span of 1 (v2-\u003ev3 or v4-\u003ev5) or any number of span (v1-\u003ev6)?\n- if the span is \u003e1 how do you control the compatibility window\n- how long do you want the rolling upgrade window to last, a few hours vs. a few weeks could result in different trade-offs\n- what about downgrades? \n\nWhat if an upgrade fails for whatever reason, what is the recourse for devops? This is something important because you can never know if a new version can work until it fully bakes on a deployment (and that could take weeks)","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":37,"context_line":"obj_to_primitive(target_version\u003d..) and primitive_to_obj() #[ov_serdes]_"},{"line_number":38,"context_line":"methods is used internally to convert/retrieve objects before/after messaging."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Considering rolling upgrades, there are several scenarios to look at:"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"* publisher (generally neutron-server or a service) and subscriber (agent)"},{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cb4a9227","line":40,"in_reply_to":"fa32b979_afa89a21","updated":"2015-06-28 07:01:58.000000000","message":"As far as I understood, in oslo versionedobjects you write an obj_make_compatible method to handle version conversions: \n\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L460\n\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/tests/test_objects.py#L111\n\nAnd across one project version, objects could have migrated several versions as they change fields.\n\nSo we shall not set a limit on version spans.\n\nOf course downgraded objects would have less detailed fields, and upgraded objects would have more detailed (and defaulted/converted) fields, but still they\u0027d be compatible with their pieces of code.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"58f224a074f37f6266aaaf3d22830880dc9ffaa4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"obj_to_primitive(target_version\u003d..) and primitive_to_obj() #[ov_serdes]_"},{"line_number":38,"context_line":"methods is used internally to convert/retrieve objects before/after messaging."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Considering rolling upgrades, there are several scenarios to look at:"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"* publisher (generally neutron-server or a service) and subscriber (agent)"},{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_dc8d772b","line":40,"in_reply_to":"fa32b979_cb4a9227","updated":"2015-06-28 18:05:12.000000000","message":"I agree with Miguel. As long as neutron-server maintains convertors for all versions running in cluster, it should depend on deployer and their upgrade schedule. As long as they understand that the more diverse the cluster, the higher performance hit for a server, that should be fine.\n\nPerformance drop due to multiple queues fanned out will be balanced by the fact that we\u0027ll propagate event in one go, without depending on the number of subscribers.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"5850c549d91fd19a0aaae3248e7ada229f8b10c9","unresolved":false,"context_lines":[{"line_number":37,"context_line":"obj_to_primitive(target_version\u003d..) and primitive_to_obj() #[ov_serdes]_"},{"line_number":38,"context_line":"methods is used internally to convert/retrieve objects before/after messaging."},{"line_number":39,"context_line":""},{"line_number":40,"context_line":"Considering rolling upgrades, there are several scenarios to look at:"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"* publisher (generally neutron-server or a service) and subscriber (agent)"},{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba3cc151_b631dca4","line":40,"in_reply_to":"fa32b979_dc8d772b","updated":"2015-06-30 15:07:11.000000000","message":"ok so oslo versioning can do version upgrade or downgrade, but still could we mention explicitly in the spec that we must support both software upgrades and downgrades because that can have implication at the macro level (see below).","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"},{"line_number":44,"context_line":"  without issues."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"* publisher knows (and sends) an older version of the object, subscriber"},{"line_number":47,"context_line":"  will get the object updated to latest version on arrival before any"},{"line_number":48,"context_line":"  callback is called."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_37f3c374","line":46,"updated":"2015-06-25 12:42:27.000000000","message":"if publisher \u003d\u003d neutron-server, then there is no need to support that case since neutron-server is upgraded first, always.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"},{"line_number":44,"context_line":"  without issues."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"* publisher knows (and sends) an older version of the object, subscriber"},{"line_number":47,"context_line":"  will get the object updated to latest version on arrival before any"},{"line_number":48,"context_line":"  callback is called."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_6f2ff2a7","line":46,"in_reply_to":"fa32b979_37f3c374","updated":"2015-06-26 16:42:28.000000000","message":"If neutron server is always upgraded first, then it should simply fan out both versions until all agents have upgraded?","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"5850c549d91fd19a0aaae3248e7ada229f8b10c9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"},{"line_number":44,"context_line":"  without issues."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"* publisher knows (and sends) an older version of the object, subscriber"},{"line_number":47,"context_line":"  will get the object updated to latest version on arrival before any"},{"line_number":48,"context_line":"  callback is called."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba3cc151_f6d8c41f","line":46,"in_reply_to":"fa32b979_37f3c374","updated":"2015-06-30 15:07:11.000000000","message":"It is important to define the right vocabulary because \"old\"/\"new\" version can have opposite semantics: version age vs. upgrade/downgrade.\nWhen you upgrade the \"new\" (or target) version is higher than the old version. For downgrade, the new version is lower.\nThat is why I personally prefer to use \"origin\" version and \"target\" version to avoid any ambiguity.\n\n\nIhar states that on an upgrade you must always upgrade the neutron server first and thus publisher can never send an older version of messages. This is clearly not true for a downgrade.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"},{"line_number":44,"context_line":"  without issues."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"* publisher knows (and sends) an older version of the object, subscriber"},{"line_number":47,"context_line":"  will get the object updated to latest version on arrival before any"},{"line_number":48,"context_line":"  callback is called."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_086424e3","line":46,"in_reply_to":"fa32b979_37f3c374","updated":"2015-06-26 14:39:43.000000000","message":"ok, then that case can go with an error in the agent saying \"Upgrade neutron-server\" first...\n\nAnd if we ever wanted to support upgrades in agent first, it\u0027s easy.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":43,"context_line":"  know the same version of the objects, so they serialize, and deserialize"},{"line_number":44,"context_line":"  without issues."},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"* publisher knows (and sends) an older version of the object, subscriber"},{"line_number":47,"context_line":"  will get the object updated to latest version on arrival before any"},{"line_number":48,"context_line":"  callback is called."},{"line_number":49,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cb713279","line":46,"in_reply_to":"fa32b979_6f2ff2a7","updated":"2015-06-28 07:01:58.000000000","message":"Here we have the issue of knowing what\u0027s the old version when we boot the server.\n\n(continous vs release upgrades discussion).\n\nProbably a good strategy, as nova does, is pining an \"old version\" in configuration, and fanning out both until that\u0027s removed from config (option c)\n\n\nFor the future I\u0027d look into agents reporting the object versions they support, so then neutron server can fan out the right versions to all agents, or as described in \"b\", do it dynamically by agent request when agent finds an object version he doesn\u0027t understand. (this would be automatically handled by the remote pub/sub library).","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"a) The subscriber will send a registry.get_info for the latest specific version"},{"line_number":55,"context_line":"   he knows off. This can have scalability issues during upgrade as any outdated"},{"line_number":56,"context_line":"   agent will require a flow of two messages (request, and response)."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":59,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_f7123b60","line":56,"updated":"2015-06-25 12:42:27.000000000","message":"Please clarify: two messages \u003d\u003d separate versioned stream of updates per agent version running in cluster? So all agents are overloaded with unneeded data to deserialize?","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"a) The subscriber will send a registry.get_info for the latest specific version"},{"line_number":55,"context_line":"   he knows off. This can have scalability issues during upgrade as any outdated"},{"line_number":56,"context_line":"   agent will require a flow of two messages (request, and response)."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":59,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_6ae7e046","line":56,"in_reply_to":"fa32b979_48f6acfa","updated":"2015-06-26 16:42:28.000000000","message":"this can be problematic at scale as the neutron server can get flooded if there are a lot of subscribers.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"a) The subscriber will send a registry.get_info for the latest specific version"},{"line_number":55,"context_line":"   he knows off. This can have scalability issues during upgrade as any outdated"},{"line_number":56,"context_line":"   agent will require a flow of two messages (request, and response)."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":59,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_4b0442c5","line":56,"in_reply_to":"fa32b979_6ae7e046","updated":"2015-06-28 07:01:58.000000000","message":"I agree, regarding scalability \"b\" or \"c\" are preferable options.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":"a) The subscriber will send a registry.get_info for the latest specific version"},{"line_number":55,"context_line":"   he knows off. This can have scalability issues during upgrade as any outdated"},{"line_number":56,"context_line":"   agent will require a flow of two messages (request, and response)."},{"line_number":57,"context_line":""},{"line_number":58,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":59,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_48f6acfa","line":56,"in_reply_to":"fa32b979_f7123b60","updated":"2015-06-26 14:39:43.000000000","message":"No, the messages would be:\n\n1) fanout of unsupported version received\n\n2) rpc to request info for the resource type + uuid\n\n3) response of this rpc\n\nThree in total. There will be a 2 message extra penalty until all agents are updated.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":60,"context_line":"   of this version, is the need to ignore new version objects as long as we keep"},{"line_number":61,"context_line":"   receiving the downgraded ones, and otherwise resend the request to send the"},{"line_number":62,"context_line":"   downgraded objects after a certain timeout (thinking of the case where the"},{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_12280d85","line":63,"updated":"2015-06-25 12:42:27.000000000","message":"Well, we can have a separate \u0027backwards compat\u0027 mode for neutron-server for the time of upgrade if it makes our lives easier. After upgrade is done, you disable the older versions and send a signal to neutron-server so that it reloads its configuration files and stop propagating updates for older versions.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":60,"context_line":"   of this version, is the need to ignore new version objects as long as we keep"},{"line_number":61,"context_line":"   receiving the downgraded ones, and otherwise resend the request to send the"},{"line_number":62,"context_line":"   downgraded objects after a certain timeout (thinking of the case where the"},{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_886114ab","line":63,"in_reply_to":"fa32b979_12280d85","updated":"2015-06-26 14:39:43.000000000","message":"Ok, that could be another option.\n\nI personally prefer the \"admin doesn\u0027t need to care\" or \"deployment tools doesn\u0027t need to care\", but, probably it\u0027s a reasonable option for a first iteration.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":60,"context_line":"   of this version, is the need to ignore new version objects as long as we keep"},{"line_number":61,"context_line":"   receiving the downgraded ones, and otherwise resend the request to send the"},{"line_number":62,"context_line":"   downgraded objects after a certain timeout (thinking of the case where the"},{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_ebf3d6e5","line":63,"in_reply_to":"fa32b979_886114ab","updated":"2015-06-28 07:01:58.000000000","message":"A note, for this to be possible we need somehow to save current versions being fanned out, then restart the agent.\n\nFor example from 2015.1 to 2015.2 we could have several jumps in versions, because across commits the versions changed (I think that\u0027s necessary if we want to allow continuous upgrades in the future as we do with migrations).","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"58f224a074f37f6266aaaf3d22830880dc9ffaa4","unresolved":false,"context_lines":[{"line_number":60,"context_line":"   of this version, is the need to ignore new version objects as long as we keep"},{"line_number":61,"context_line":"   receiving the downgraded ones, and otherwise resend the request to send the"},{"line_number":62,"context_line":"   downgraded objects after a certain timeout (thinking of the case where the"},{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_5cc96759","line":63,"in_reply_to":"fa32b979_ebf3d6e5","updated":"2015-06-28 18:05:12.000000000","message":"I prefer doing the dumb but simple approach first (pinning the oldest version to publish in config file), and then once it works, consider autodetection of versions in cluster and on demand expansion of the pool of backported queues","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"},{"line_number":67,"context_line":"avoid any performance issues."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Serialized versioned objects look like::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_d2a2a5fb","line":66,"updated":"2015-06-25 12:42:27.000000000","message":"What do you mean by saying that agents are upgraded first? They are always upgraded after API/DB service.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":63,"context_line":"   request for downgraded queue is done, but the publisher restarted)."},{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"},{"line_number":67,"context_line":"avoid any performance issues."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Serialized versioned objects look like::"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_c815dce5","line":66,"in_reply_to":"fa32b979_d2a2a5fb","updated":"2015-06-26 14:39:43.000000000","message":"Sorry, ignore  that part, I confused the the upgrade order.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":64,"context_line":""},{"line_number":65,"context_line":""},{"line_number":66,"context_line":"option a seems like a simpler strategy as long as the agents are upgraded first to"},{"line_number":67,"context_line":"avoid any performance issues."},{"line_number":68,"context_line":""},{"line_number":69,"context_line":"Serialized versioned objects look like::"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_abfdceb2","line":67,"updated":"2015-06-28 07:01:58.000000000","message":"and option a, as Alec said, doesn\u0027t scale well, even if it\u0027s simpler.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":72,"context_line":"    \u0027versioned_object.name\u0027: \u0027QoSProfile\u0027,"},{"line_number":73,"context_line":"    \u0027versioned_object.data\u0027: {\u0027rules\u0027: ["},{"line_number":74,"context_line":"                                        {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":75,"context_line":"                                         \u0027versioned_object.name\u0027: \u0027QoSRule\u0027,"},{"line_number":76,"context_line":"                                         \u0027versioned_object.data\u0027: {\u0027name\u0027: u\u0027a\u0027},"},{"line_number":77,"context_line":"                                         \u0027versioned_object.namespace\u0027: \u0027versionedobjects\u0027}"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_f2dd6941","line":74,"updated":"2015-06-25 12:42:27.000000000","message":"OK, so in the end, we *have* version inside the object...","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"58f224a074f37f6266aaaf3d22830880dc9ffaa4","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":72,"context_line":"    \u0027versioned_object.name\u0027: \u0027QoSProfile\u0027,"},{"line_number":73,"context_line":"    \u0027versioned_object.data\u0027: {\u0027rules\u0027: ["},{"line_number":74,"context_line":"                                        {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":75,"context_line":"                                         \u0027versioned_object.name\u0027: \u0027QoSRule\u0027,"},{"line_number":76,"context_line":"                                         \u0027versioned_object.data\u0027: {\u0027name\u0027: u\u0027a\u0027},"},{"line_number":77,"context_line":"                                         \u0027versioned_object.namespace\u0027: \u0027versionedobjects\u0027}"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_1cf19f95","line":74,"in_reply_to":"fa32b979_c8ecfcf5","updated":"2015-06-28 18:05:12.000000000","message":"I probably misunderstood the nova guys: they probably didn\u0027t mean there is no way to get versioned object on the wire, the just meant that it\u0027s not going to happen unless we are fine to break upgrade scenario (for the major RPC version would just bump due to complete redefinition of payload).","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":71,"context_line":"   {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":72,"context_line":"    \u0027versioned_object.name\u0027: \u0027QoSProfile\u0027,"},{"line_number":73,"context_line":"    \u0027versioned_object.data\u0027: {\u0027rules\u0027: ["},{"line_number":74,"context_line":"                                        {\u0027versioned_object.version\u0027: \u00271.0\u0027,"},{"line_number":75,"context_line":"                                         \u0027versioned_object.name\u0027: \u0027QoSRule\u0027,"},{"line_number":76,"context_line":"                                         \u0027versioned_object.data\u0027: {\u0027name\u0027: u\u0027a\u0027},"},{"line_number":77,"context_line":"                                         \u0027versioned_object.namespace\u0027: \u0027versionedobjects\u0027}"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_c8ecfcf5","line":74,"in_reply_to":"fa32b979_f2dd6941","updated":"2015-06-26 14:39:43.000000000","message":"Yep, objects and sub objects have versioning embedded.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"6aafe2df99fa174248a028f4b61c6501c3529405","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"if we adopted option b for rolling upgrades:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_12eb2d14","line":90,"updated":"2015-06-25 12:42:27.000000000","message":"I would make all queues contain explicit *major* version, to avoid special handling.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"if we adopted option b for rolling upgrades:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_2b845e09","line":90,"in_reply_to":"fa32b979_0af41485","updated":"2015-06-28 07:01:58.000000000","message":"For oslo versioned objects, I think the idea is that everytime you make a change to the model you need to bump the version, they have a x.y.z versioning scheme.\n\n.z is reserved for stable backports(only additive changes).","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"0371916cdf099fd5aa7f806a62f46512b4fd44e9","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"if we adopted option b for rolling upgrades:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_0878a42a","line":90,"in_reply_to":"fa32b979_12eb2d14","updated":"2015-06-26 14:39:43.000000000","message":"If we follow the option \"c\" you proposed, it makes total sense.\n\nFor the \"b\" \"automatic approach\", no, since older agents need to discover new messages arriving.\n\nBut I\u0027m good with option \"c\" for a start.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"if we adopted option b for rolling upgrades:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_0af41485","line":90,"in_reply_to":"fa32b979_12eb2d14","updated":"2015-06-26 16:42:28.000000000","message":"please explain how the major version in the topic name is managed?\nIt is a monotonically increased number for each upgrade? or is it a major version derived from the new neutron version?\nwho controls that number?\nhow do the agents know which major to use?\nI think adding a major in a topic name will add complexity and confusion as there is already a versioning in the message itself.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"5850c549d91fd19a0aaae3248e7ada229f8b10c9","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"if we adopted option b for rolling upgrades:"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba3cc151_71259ea9","line":90,"in_reply_to":"fa32b979_2b845e09","updated":"2015-06-30 15:07:11.000000000","message":"I get that, my question was about the management of the topic name which now is supposed to contain \"a\" major version in its name (that is what Ihar suggests).  Where does that major version in the topic name come from? Is it extracted from the major of the versioned object exchanged on that topic? Can a topic have messages with different \u0027versioned_object_name\u0027 or is it limited to 1 only?","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"bb568594714769aab988cbe53a4daf6b603a5c55","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Subscribing to resources"},{"line_number":95,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_cfeddeb8","line":92,"updated":"2015-06-26 16:42:28.000000000","message":"could you provide an estimate (order of magnitude - worst case largest scale scenario) of:\n- how many topics that could represent at scale \n- the frequency of updates\nWe know that the number of agents could be in the order of 1000, 10,000 worts case.\nThis will be helpful for the oslo messaging team.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"5850c549d91fd19a0aaae3248e7ada229f8b10c9","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Subscribing to resources"},{"line_number":95,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"ba3cc151_b1d80655","line":92,"in_reply_to":"fa32b979_0b987a69","updated":"2015-06-30 15:07:11.000000000","message":"worst case is if all nodes have at least 1 port belonging to a security group of profile (e.g. there are lots of instances and they are spread).\n\nOn the number of topics, assuming we have ~10 QOS profiles and security groups per tenant, largest deployments could have ~1000 tenants, so looks like we\u0027re in the ballpark figure of max ~10,000 topics (multiplied by the number of standing versions in the cloud) ?","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"c4112ab5b86d694b86de32bdeeea064cd5b947c8","unresolved":false,"context_lines":[{"line_number":89,"context_line":""},{"line_number":90,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e"},{"line_number":91,"context_line":"+"},{"line_number":92,"context_line":"neutron-\u003cresource_type\u003e-\u003cresource_id\u003e-\u003cvo_version\u003e"},{"line_number":93,"context_line":""},{"line_number":94,"context_line":"Subscribing to resources"},{"line_number":95,"context_line":"\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d"}],"source_content_type":"text/x-rst","patch_set":4,"id":"fa32b979_0b987a69","line":92,"in_reply_to":"fa32b979_cfeddeb8","updated":"2015-06-28 07:01:58.000000000","message":"It wouldn\u0027t depend on the number of nodes itself, but for neutron, it would depend on the number of security groups, and the number of qos profiles.\n\nI\u0027d say 2-3 topics per tenant by default. Increasing if tenants create more security groups or more qos profiles (I would only expect to have 10-20 QoS profiles per installation -shooting high-)\n\nNot all nodes would be subscribed to all topics, only when the node has ports belonging to a specific security group or QoS profile.","commit_id":"29a9624ac806bee221e39072c470a8717f67d39a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"3f5812d5efb3886ac13f0d6860a6c86dedc67a0d","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  callback is called."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* publisher sends a newer version of the object, subscriber won\u0027t be able"},{"line_number":58,"context_line":"  to deserialize the object, in this case (PLEASE DISCUSS), we can think of two"},{"line_number":59,"context_line":"  strategies:"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"a) During upgrades, we pin neutron-server to a compatible version for resource"}],"source_content_type":"text/x-rst","patch_set":5,"id":"fa32b979_dc5ed778","line":58,"updated":"2015-06-28 18:15:25.000000000","message":"two-\u003eseveral","commit_id":"257c9cc8fce6daa4f40af16863dd3b8cc4aa9bee"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"2115774ec603abd801949c72b1fbd312f855cdca","unresolved":false,"context_lines":[{"line_number":149,"context_line":"        registry.subscribe(resources.QOS_RULES, qos_policy_id,"},{"line_number":150,"context_line":"                           callback\u003dprocess_resource_updates)"},{"line_number":151,"context_line":"        qos_rules \u003d registry.get_info(resources.QOS_RULES, qos_policy_id,"},{"line_number":152,"context_line":"                                      callback\u003dprocess_resource_updates)"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        cleanup_subscriptions()"},{"line_number":155,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba3cc151_c70ff02c","line":152,"updated":"2015-06-30 10:52:13.000000000","message":"remove callback from get_info","commit_id":"257c9cc8fce6daa4f40af16863dd3b8cc4aa9bee"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"99937bdd601bccfead8535fb24f245648061b7ca","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"* unsubscribe_resource_id(): it selectively unsubscribes an specific"},{"line_number":181,"context_line":"                             resource type + id."},{"line_number":182,"context_line":"* unsubscribe_resource_type(): it unsubscribes from an specific resource type,"},{"line_number":183,"context_line":"                               any ID."},{"line_number":184,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":185,"context_line":""}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba3cc151_8f1dac68","line":182,"updated":"2015-06-29 15:51:44.000000000","message":"as spoken with Ihar this is probably a YAGNI.","commit_id":"257c9cc8fce6daa4f40af16863dd3b8cc4aa9bee"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"99937bdd601bccfead8535fb24f245648061b7ca","unresolved":false,"context_lines":[{"line_number":181,"context_line":"                             resource type + id."},{"line_number":182,"context_line":"* unsubscribe_resource_type(): it unsubscribes from an specific resource type,"},{"line_number":183,"context_line":"                               any ID."},{"line_number":184,"context_line":"* unsubscribe_all(): it unsubscribes all subscribed resources and ids."},{"line_number":185,"context_line":""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"Sending resource updates"}],"source_content_type":"text/x-rst","patch_set":5,"id":"ba3cc151_0f20bc9a","line":184,"updated":"2015-06-29 15:51:44.000000000","message":"YAGNI.\n\nCould be valuable for testing cleanups btw.","commit_id":"257c9cc8fce6daa4f40af16863dd3b8cc4aa9bee"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"30ef9cacfe5d291cf5e75343efe59d448e302ed2","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  callback is called."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* publisher sends a newer version of the object, subscriber won\u0027t be able"},{"line_number":58,"context_line":"  to deserialize the object, in this case (PLEASE DISCUSS), we can think of two"},{"line_number":59,"context_line":"  strategies:"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"a) During upgrades, we pin neutron-server to a compatible version for resource"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_0a30759d","line":58,"updated":"2015-06-30 15:06:18.000000000","message":"bit confusing as you shifted the bullet letters by one ;-)\nc -\u003e a\na-\u003e b\nb-\u003e c","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"51e9df3e9a6cf4b7af79fc4856b8eab9209a8160","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  callback is called."},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"* publisher sends a newer version of the object, subscriber won\u0027t be able"},{"line_number":58,"context_line":"  to deserialize the object, in this case (PLEASE DISCUSS), we can think of two"},{"line_number":59,"context_line":"  strategies:"},{"line_number":60,"context_line":""},{"line_number":61,"context_line":"a) During upgrades, we pin neutron-server to a compatible version for resource"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_9621ffb6","line":58,"in_reply_to":"ba3cc151_0a30759d","updated":"2015-06-30 19:42:42.000000000","message":"I miss something. Letters are a, b, c, what do you mean? \n\nAgain, I forgot to change \"two\" to \"several\" .. \u0027:/ \nyikes.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"30ef9cacfe5d291cf5e75343efe59d448e302ed2","unresolved":false,"context_lines":[{"line_number":62,"context_line":"   fanout updates, and server sends both the old, and the newer version to"},{"line_number":63,"context_line":"   different topic, queues. Old agents receive the updates on the old version"},{"line_number":64,"context_line":"   topic, new agents receive updates on the new version topic."},{"line_number":65,"context_line":"   When the whole system upgraded, we un-pin the compatible version fanout."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_0a939550","line":65,"updated":"2015-06-30 15:06:18.000000000","message":"so does it mean that the neutron server must always know how to encode all the versions in the upgrade/downgrade window? That sounds pretty difficult to achieve if we keep an arbitrary upgrade/downgrade span.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"51e9df3e9a6cf4b7af79fc4856b8eab9209a8160","unresolved":false,"context_lines":[{"line_number":62,"context_line":"   fanout updates, and server sends both the old, and the newer version to"},{"line_number":63,"context_line":"   different topic, queues. Old agents receive the updates on the old version"},{"line_number":64,"context_line":"   topic, new agents receive updates on the new version topic."},{"line_number":65,"context_line":"   When the whole system upgraded, we un-pin the compatible version fanout."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_f695ebe3","line":65,"in_reply_to":"ba3cc151_0a939550","updated":"2015-06-30 19:42:42.000000000","message":"That\u0027s the fun of versioned objects. You can ask them to downgrade to any specific version in runtime:\n\nhttps://github.com/openstack/oslo.versionedobjects/blob/master/oslo_versionedobjects/base.py#L460\n\nAnd this is why we\u0027re proposing this api only in combination with versioned objects :)","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":62,"context_line":"   fanout updates, and server sends both the old, and the newer version to"},{"line_number":63,"context_line":"   different topic, queues. Old agents receive the updates on the old version"},{"line_number":64,"context_line":"   topic, new agents receive updates on the new version topic."},{"line_number":65,"context_line":"   When the whole system upgraded, we un-pin the compatible version fanout."},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_546ff091","line":65,"in_reply_to":"ba3cc151_0a939550","updated":"2015-06-30 20:11:38.000000000","message":"We may see how hard it is to maintain larger window. If it\u0027s hard, we can stick to one major version span, which should be fine and reflect current expectations.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"30ef9cacfe5d291cf5e75343efe59d448e302ed2","unresolved":false,"context_lines":[{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"},{"line_number":69,"context_line":"   latest version and upgrade any fields internally. Again at the end, we"},{"line_number":70,"context_line":"   unpin the version and restart the service."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":73,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_0a671526","line":70,"updated":"2015-06-30 15:06:18.000000000","message":"And older agents will have to ignore new fields, which also means that you can never remove/rename/change existing fields and means that whatever change is introduced in these versioned objects must take into account the downgrade case.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"51e9df3e9a6cf4b7af79fc4856b8eab9209a8160","unresolved":false,"context_lines":[{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"},{"line_number":69,"context_line":"   latest version and upgrade any fields internally. Again at the end, we"},{"line_number":70,"context_line":"   unpin the version and restart the service."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":73,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_96733fe7","line":70,"in_reply_to":"ba3cc151_0a671526","updated":"2015-06-30 19:42:42.000000000","message":"Again, the fun of versioned objects. That\u0027s already done for us. (of course, as you evolve your objects you need to add the logic to do the translations, but it\u0027s not complicated as the internal mechanism of versioned object take care of the high level logic of conversion and cross object compatibility, etc..)","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"},{"line_number":69,"context_line":"   latest version and upgrade any fields internally. Again at the end, we"},{"line_number":70,"context_line":"   unpin the version and restart the service."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":73,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_f41ba419","line":70,"in_reply_to":"ba3cc151_0a671526","updated":"2015-06-30 20:11:38.000000000","message":"They would see the version that is unknown to them and just drop it. That\u0027s assuming that oslo.versionedobjects payload format does not change itself.\n\nAnyway, the solution has its problems, like exposing every agent to redundant data, while not offloading neutron-server from actually generating those multiple versions of objects.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"5a0579b71a6d1b1ad0dd4ded305f3e0824e1abbb","unresolved":false,"context_lines":[{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"},{"line_number":69,"context_line":"   latest version and upgrade any fields internally. Again at the end, we"},{"line_number":70,"context_line":"   unpin the version and restart the service."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":73,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_04638442","line":70,"in_reply_to":"ba3cc151_0e50735c","updated":"2015-07-07 09:26:44.000000000","message":"I am not sure this is the preferred, actually. For now, we have a version that does not consider upgrade scenarios at all. I would still want us to have multiple versioned queues in parallel.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":11744,"name":"Alec Hothan","email":"ahothan@cisco.com","username":"ahothan"},"change_message_id":"61f36bec33191420e2e66f9e7902dfbd6a0a5cec","unresolved":false,"context_lines":[{"line_number":67,"context_line":"   A variant of this could be using a single fanout queue, and sending the"},{"line_number":68,"context_line":"   pinned version of the object to all. Newer agents can deserialize to the"},{"line_number":69,"context_line":"   latest version and upgrade any fields internally. Again at the end, we"},{"line_number":70,"context_line":"   unpin the version and restart the service."},{"line_number":71,"context_line":""},{"line_number":72,"context_line":"b) The subscriber will rpc call the publisher to start publishing also a downgraded"},{"line_number":73,"context_line":"   version of the object on every update on a separate queue. The complication"}],"source_content_type":"text/x-rst","patch_set":6,"id":"ba3cc151_0e50735c","line":70,"in_reply_to":"ba3cc151_f41ba419","updated":"2015-06-30 21:49:17.000000000","message":"As this option seems to be the one preferred, might be worth adding a bit more detail on the versioning?\nNot quite sure at this point if the plan is for the publisher to:\n\n- send only one version of each fanout message (the target version) and let the subscribers deal with up or down conversion of the received message (apparently oslo versioning handles that although I\u0027m not quite sure how it could work when down-converting when for example a field is being modified)\n\n- send as many versions as there are known subscriber versions, in this case the burden if for the publisher to know how to encode all these versions (and here I\u0027m not sure how that would work for a software downgrade since by definition a version 1 would not know how to encode a version 2 message).","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":11,"context_line":""},{"line_number":12,"context_line":"In Neutron, agents may need to subscribe to specific resource details which"},{"line_number":13,"context_line":"may change over time. And the purpose of this messaging callback system"},{"line_number":14,"context_line":"is to allow agent subscription to those resources without the need to extend"},{"line_number":15,"context_line":"modify existing RPC calls, or creating new RPC messages."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"A few resource which can benefit of this system:"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba3cc151_c939f4a5","line":14,"updated":"2015-07-01 17:54:23.000000000","message":"nit: extend or modify","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":14,"context_line":"is to allow agent subscription to those resources without the need to extend"},{"line_number":15,"context_line":"modify existing RPC calls, or creating new RPC messages."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"A few resource which can benefit of this system:"},{"line_number":18,"context_line":""},{"line_number":19,"context_line":"* security groups members"},{"line_number":20,"context_line":"* security group rules,"}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba3cc151_694b082b","line":17,"updated":"2015-07-01 17:54:23.000000000","message":"resources","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":177,"context_line":""},{"line_number":178,"context_line":"There are a few options to unsubscribe registered callbacks:"},{"line_number":179,"context_line":""},{"line_number":180,"context_line":"* unsubscribe_resource_id(): it selectively unsubscribes an specific"},{"line_number":181,"context_line":"                             resource type + id."},{"line_number":182,"context_line":"* unsubscribe_resource_type(): it unsubscribes from an specific resource type,"},{"line_number":183,"context_line":"                               any ID."}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba3cc151_09da7c17","line":180,"updated":"2015-07-01 17:54:23.000000000","message":"missing method params","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":189,"context_line":""},{"line_number":190,"context_line":"On the server side, resource updates could come from anywhere, a service plugin,"},{"line_number":191,"context_line":"an extension, anything that updates the resource and that it\u0027s of any interest"},{"line_number":192,"context_line":"to the agents."},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"The server/publisher side may look like::"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-rst","patch_set":13,"id":"ba3cc151_e9ce382d","line":192,"updated":"2015-07-01 17:54:23.000000000","message":"agent\u003d\u003esubscribers.\nI think these fanout messages may be used by some entities except agents., i.e some auditing service","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"}],"neutron/api/rpc/callbacks/registry.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"#resource implementation callback registration functions"},{"line_number":27,"context_line":"def get_info(resource_type, resource_id, **kwargs):"},{"line_number":28,"context_line":"    \"\"\"Get information about resource type with resource id."},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    The function will check the providers for an specific remotable"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_c9bed464","line":27,"updated":"2015-07-01 17:54:23.000000000","message":"why this is called get_info? Should it be something like get_resource (or get_resource_details)?","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0c5a150fa5f06a1e255e09c335e4ce0ec641e05e","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    The function will check the providers for an specific remotable"},{"line_number":31,"context_line":"    resource and get the resource."},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    :returns: an oslo versioned object."},{"line_number":34,"context_line":"    \"\"\""},{"line_number":35,"context_line":"    callback \u003d _get_resources_callback_manager().get_callback(resource_type)"},{"line_number":36,"context_line":"    if callback:"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_abe4b2e0","line":33,"updated":"2015-07-01 14:46:23.000000000","message":"we should start referring to them as neutron objects","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"}],"neutron/api/rpc/callbacks/resources.py":[{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"52f506d167fe752252e584a0d5bc1a1812900831","unresolved":false,"context_lines":[{"line_number":13,"context_line":"QOS_POLICY \u003d \u0027qos-policy\u0027"},{"line_number":14,"context_line":"QOS_RULE \u003d \u0027qos-rule\u0027"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VALID \u003d ("},{"line_number":17,"context_line":"    QOS_POLICY,"},{"line_number":18,"context_line":"    QOS_RULE,"},{"line_number":19,"context_line":")"}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_ec06461c","line":16,"updated":"2015-07-01 17:54:23.000000000","message":"VALID\u003d\u003e VALID_RESOURCES","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"}],"neutron/rpc_callbacks/events.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"UPDATED \u003d \u0027updated\u0027"},{"line_number":14,"context_line":"DELETED \u003d \u0027deleted\u0027"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VALID \u003d ("},{"line_number":17,"context_line":"    UPDATED,"},{"line_number":18,"context_line":"    DELETED"},{"line_number":19,"context_line":")"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_576ff291","line":16,"updated":"2015-06-30 20:11:38.000000000","message":"VALID_what? Please consider expanding the name.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"}],"neutron/rpc_callbacks/registry.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron.callbacks import manager"},{"line_number":14,"context_line":""},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(armax): consider adding locking"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_d7a542b5","line":13,"updated":"2015-06-30 20:11:38.000000000","message":"Not sure how those two mechanisms are related.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":23,"context_line":"        CALLBACK_MANAGER \u003d manager.CallbacksManager()"},{"line_number":24,"context_line":"    return CALLBACK_MANAGER"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"def get_info(resource, resource_id):"},{"line_number":27,"context_line":"    #TODO(QoS):"},{"line_number":28,"context_line":"    #"},{"line_number":29,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_37e90ee7","line":26,"updated":"2015-06-30 20:11:38.000000000","message":"In the end, weren\u0027t we going to include call to fetch data into subscription API to avoid potential races?","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":28,"context_line":"    #"},{"line_number":29,"context_line":""},{"line_number":30,"context_line":"def subscribe(callback, resource, resource_id):"},{"line_number":31,"context_line":"    _get_callback_manager().subscribe(callback, resource, event)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"def unsubscribe(callback, resource, event):"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_77e8f6b4","line":31,"updated":"2015-06-30 20:11:38.000000000","message":"so resource_id or event?","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":35,"context_line":"    _get_callback_manager().unsubscribe(callback, resource, event)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"def unsubscribe_all(callback):"},{"line_number":39,"context_line":"    _get_callback_manager().unsubscribe_all(callback)"},{"line_number":40,"context_line":""},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_779a3665","line":38,"updated":"2015-06-30 20:11:38.000000000","message":"Wasn\u0027t it supposed to be killed due to YAGNI?","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":42,"context_line":"def notify(resource, event, trigger, **kwargs):"},{"line_number":43,"context_line":"    _get_callback_manager().notify(resource, event, trigger, **kwargs)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"def register(callback, resource):"},{"line_number":46,"context_line":"    #TODO(QoS):...."},{"line_number":47,"context_line":"    pass"},{"line_number":48,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_9739fa43","line":45,"updated":"2015-06-30 20:11:38.000000000","message":"is it subscribe_resource_type or what?","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":10,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"from neutron.callbacks import manager"},{"line_number":14,"context_line":"from neutron.rpc_callbacks import resource_manager"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"# TODO(armax): consider adding locking"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_b559845c","line":13,"updated":"2015-07-01 07:04:15.000000000","message":"We can remove this reference, our subscribe/notify won\u0027t work with the std callbacks","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"def _get_rpc_callback_manager():"},{"line_number":22,"context_line":"    global RPC_CALLBACK_MANAGER"},{"line_number":23,"context_line":"    if RPC_CALLBACK_MANAGER is None:"},{"line_number":24,"context_line":"        RPC_CALLBACK_MANAGER \u003d manager.CallbacksManager()"},{"line_number":25,"context_line":"    return RPC_CALLBACK_MANAGER"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_f5262ccd","line":22,"updated":"2015-07-01 07:04:15.000000000","message":"We can change the whole block here for a #TODO(QoS) / pass","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":45,"context_line":""},{"line_number":46,"context_line":"# resource RPC callback for pub/sub"},{"line_number":47,"context_line":"def subscribe(callback, resource, event):"},{"line_number":48,"context_line":"    _get_rpc_callback_manager().subscribe(callback, resource, event)"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def unsubscribe(callback, resource, event):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_55d598b6","line":48,"updated":"2015-07-01 07:04:15.000000000","message":"I\u0027d put a big #TODO(QoS): we have to finish update side ^","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"def unsubscribe(callback, resource, event):"},{"line_number":52,"context_line":"    _get_rpc_callback_manager().unsubscribe(callback, resource, event)"},{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def unsubscribe_all(callback):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_b5e664b2","line":52,"updated":"2015-07-01 07:04:15.000000000","message":"todo","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":53,"context_line":""},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"def unsubscribe_all(callback):"},{"line_number":56,"context_line":"    _get_rpc_callback_manager().unsubscribe_all(callback)"},{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def notify(resource, event, trigger, **kwargs):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_95f2406e","line":56,"updated":"2015-07-01 07:04:15.000000000","message":"todo","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":57,"context_line":""},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"def notify(resource, event, trigger, **kwargs):"},{"line_number":60,"context_line":"    _get_rpc_callback_manager().notify(resource, event, trigger, **kwargs)"},{"line_number":61,"context_line":""},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def clear():"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_35e9f480","line":60,"updated":"2015-07-01 07:04:15.000000000","message":"todo","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"def clear():"},{"line_number":64,"context_line":"    _get_resources_callback_manager().clear()"},{"line_number":65,"context_line":"    _get_rpc_callback_manager().clear()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_5516f855","line":65,"updated":"2015-07-01 07:04:15.000000000","message":"#comment the last one ^","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"}],"neutron/rpc_callbacks/resource_manager.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ResourcesCallbacksManager(object):"},{"line_number":24,"context_line":"    \"\"\"A callback system that allows objects to cooperate in a loose manner.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_8083e055","line":23,"updated":"2015-07-01 07:04:15.000000000","message":"ResourceProviderManager?","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"a6cd6f7d742a83fdecd3cb0387b48509e1024bbe","unresolved":false,"context_lines":[{"line_number":20,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ResourcesCallbacksManager(object):"},{"line_number":24,"context_line":"    \"\"\"A callback system that allows objects to cooperate in a loose manner.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_8d4eb894","line":23,"in_reply_to":"ba3cc151_8083e055","updated":"2015-07-01 09:17:33.000000000","message":"@miguel nah! ;) you talk nonsense","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":21,"context_line":""},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"class ResourcesCallbacksManager(object):"},{"line_number":24,"context_line":"    \"\"\"A callback system that allows objects to cooperate in a loose manner.\"\"\""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"    def __init__(self):"},{"line_number":27,"context_line":"        self.clear()"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_60f7bcf5","line":24,"updated":"2015-07-01 07:04:15.000000000","message":"\"\"\" A callback system to allow information providers to publish resources \"\"\"","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":26,"context_line":"    def __init__(self):"},{"line_number":27,"context_line":"        self.clear()"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    def register(self, callback, resource):"},{"line_number":30,"context_line":"        \"\"\"register callback for a resource ."},{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        One callback can be register to a resource"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_206534e0","line":29,"updated":"2015-07-01 07:04:15.000000000","message":"May be it\u0027s more clear if we call it\nregister_provider\n? :)","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":31,"context_line":""},{"line_number":32,"context_line":"        One callback can be register to a resource"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"        :param callback: the callback. It must raise or return a dict."},{"line_number":35,"context_line":"        :param resource: the resource. It must be a valid resource."},{"line_number":36,"context_line":"        \"\"\""},{"line_number":37,"context_line":"        LOG.debug(\"register: %(callback)s %(resource)s\","}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_20ac54ec","line":34,"updated":"2015-07-01 07:04:15.000000000","message":"dict -\u003e versioned object  (but for now/testing dicts are perfect)","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"        self._callbacks[resource] \u003d callback"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def unregister(self, resource):"},{"line_number":45,"context_line":"        \"\"\"Unregister callback from the registry."},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"        :param callback: the callback."}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_c06328db","line":44,"updated":"2015-07-01 07:04:15.000000000","message":"unregister_provider","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":57,"context_line":"        \"\"\"Brings the manager to a clean slate.\"\"\""},{"line_number":58,"context_line":"        self._callbacks \u003d collections.defaultdict(dict)"},{"line_number":59,"context_line":""},{"line_number":60,"context_line":"    def get_callback(self, resource):"},{"line_number":61,"context_line":"        \"\"\"Return the callback if found, None otherwise."},{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        :param resource: the resource. It must be a valid resource."}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_60a9fcde","line":60,"updated":"2015-07-01 07:04:15.000000000","message":"get_provider","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"a6cd6f7d742a83fdecd3cb0387b48509e1024bbe","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"        :param resource: the resource. It must be a valid resource."},{"line_number":64,"context_line":"        \"\"\""},{"line_number":65,"context_line":"        if resource not in resources.VALID:"},{"line_number":66,"context_line":"            raise exceptions.Invalid(element\u003d\u0027resource\u0027, value\u003dresource)"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"        return self._callbacks[resource]"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_30425f11","line":65,"updated":"2015-07-01 09:17:33.000000000","message":"ignoring all my own comments, it makes sense in the registry.py, but not here :)","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"}],"neutron/rpc_callbacks/resources.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"cf08c4d72aacd2db611787d15946d6385c7593b6","unresolved":false,"context_lines":[{"line_number":13,"context_line":"QOS_POLICY \u003d \u0027qos_policy\u0027"},{"line_number":14,"context_line":"QOS_RULE \u003d \u0027qos_rule\u0027"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VALID \u003d ("},{"line_number":17,"context_line":"    QOS_POLICY,"},{"line_number":18,"context_line":"    QOS_RULE,"},{"line_number":19,"context_line":")"}],"source_content_type":"text/x-python","patch_set":6,"id":"ba3cc151_f72166fc","line":16,"updated":"2015-06-30 20:11:38.000000000","message":"VALID what? Please also expand here.","commit_id":"c2d22d7680579b17c2651e23bd8ddd0c515a4d24"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":11,"context_line":"#    under the License."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"QOS_POLICY \u003d \u0027qos-policy\u0027"},{"line_number":14,"context_line":"QOS_BANDWIDTH_LIMIT_QOS_RULE \u003d \u0027qos-bandwidth-limit-rule\u0027"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"VALID \u003d ("},{"line_number":17,"context_line":"    QOS_POLICY,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_a03b849b","line":14,"updated":"2015-07-01 07:04:15.000000000","message":"QOS_RULE :)","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"}],"neutron/services/qos/qos_plugin.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"dff2a957e8bbbb2412b0da68e7f61cb9dd0822ed","unresolved":false,"context_lines":[{"line_number":113,"context_line":"    def register_resources_callback(self):"},{"line_number":114,"context_line":"        resource_registry.register("},{"line_number":115,"context_line":"            _get_qos_bandwidth_limit_rule_cb,"},{"line_number":116,"context_line":"            resources.QOS_BANDWIDTH_LIMIT_QOS_RULE)"},{"line_number":117,"context_line":""},{"line_number":118,"context_line":"        resource_registry.register("},{"line_number":119,"context_line":"            _get_qos_policy_cb,"}],"source_content_type":"text/x-python","patch_set":8,"id":"ba3cc151_f5406ca7","line":116,"updated":"2015-07-01 07:04:15.000000000","message":"we should just have QOS_RULE, with the versioned objects thing, will be the base class of all, so we don\u0027t need to add a new resource for every type of rule :)\n\nQoSRule\n   /|\\\n    |\nQoSBandwidthLimitRule","commit_id":"86a8d550b51be58101d9ff55db98874df21d9acc"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"0c5a150fa5f06a1e255e09c335e4ce0ec641e05e","unresolved":false,"context_lines":[{"line_number":108,"context_line":"        self._inline_test()"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"    def _inline_test(self):"},{"line_number":111,"context_line":"        #TODO(gampel) remove inline unitesting"},{"line_number":112,"context_line":"        self.ctx \u003d None"},{"line_number":113,"context_line":"        kwargs \u003d {\u0027context\u0027: self.ctx}"},{"line_number":114,"context_line":"        qos_policy \u003d rpc_registry.get_info("}],"source_content_type":"text/x-python","patch_set":13,"id":"ba3cc151_9051d938","line":111,"updated":"2015-07-01 14:46:23.000000000","message":"TODO(QoS)","commit_id":"5d2461adef353c059faba6fe2bcfa3bacf1d0162"}]}
