)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fdd618e38d0ceb5def0e01fdf1f8bfb426c5f30c","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-08 12:11:22 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC handler for service.trunk.plugin"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements rpc driver for trunk plugin."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_7ebb0276","line":7,"updated":"2016-07-08 20:31:20.000000000","message":"nit: get_trunk_by_port_id() RPC handler for OVS trunk driver","commit_id":"91c7a42648cd3712187ec642928a60f547f45c69"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fdd618e38d0ceb5def0e01fdf1f8bfb426c5f30c","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implements rpc driver for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"Only one rpc is implemented. It returns trunk"},{"line_number":12,"context_line":"information for the trunk port id provided."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Partially-implements: blueprint vlan-aware-vms"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":4,"id":"1aa78d24_5e672625","line":11,"updated":"2016-07-08 20:31:20.000000000","message":"nit: maybe just add a little more detail explaining the introduction of the OVS driver and a brief overview of the RPC API exposed by this patch.","commit_id":"91c7a42648cd3712187ec642928a60f547f45c69"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bcb72133c4ae254acf870cbd2219fb114988c97f","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-09 01:40:39 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"get_trunk_by_port_id() RPC for OVS trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces OVS driver for trunk plugin."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_9f48e8b4","line":7,"updated":"2016-07-12 17:12:05.000000000","message":"This headline could be more expressive.\n\nTo me this patch introduces the server side RPC interface for the OVS implementation of the trunk service plugin, i.e. the interface may not be complete at this point.\n\n\u0027Introduce server-side RPC interface for OVS trunk implementation\u0027.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"ae483877ff61fe992a7771e3ae323a37e5414e24","unresolved":false,"context_lines":[{"line_number":11,"context_line":"The OVS driver for trunk plugin will be used"},{"line_number":12,"context_line":"to setup the rpc handler for the plugin."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"This patch also icludes the implementation of"},{"line_number":15,"context_line":"one rpc callback: get_trunk_by_port_id()"},{"line_number":16,"context_line":"It returns information for the trunk associated"},{"line_number":17,"context_line":"with the port id provided."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":7,"id":"1aa78d24_e1455243","line":14,"range":{"start_line":14,"start_character":16,"end_line":14,"end_character":23},"updated":"2016-07-11 17:36:20.000000000","message":"sp: includes","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":6598,"name":"Berezovsky Irena","email":"irenab.dev@gmail.com","username":"irenab"},"change_message_id":"66fa4f923ba90e4f11d2bcd1b72b0f2473250677","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-17 10:09:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"get_trunk_by_port_id() RPC for OVS trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC method for getting a trunk by port_id over"},{"line_number":10,"context_line":"RPC. Includes the implementation of one rpc callback:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"dada55a8_296d0d33","line":7,"range":{"start_line":7,"start_character":30,"end_line":7,"end_character":47},"updated":"2016-07-17 10:59:32.000000000","message":"Is there anything specific for OVS in this patch.\nI think its generic RPC method support that can be used by any l2 agent supporting trunk port","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"ea0ddc76431f000fbd9a281fd932c8feaff8c137","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-17 10:09:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"get_trunk_by_port_id() RPC for OVS trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC method for getting a trunk by port_id over"},{"line_number":10,"context_line":"RPC. Includes the implementation of one rpc callback:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"dada55a8_b4cbf271","line":7,"range":{"start_line":7,"start_character":30,"end_line":7,"end_character":47},"in_reply_to":"dada55a8_296d0d33","updated":"2016-07-18 15:08:43.000000000","message":"This could be changed. This patch actually isn\u0027t even introducing the OVS driver. As you point out the method being exposed here is of general utility to any agent.","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ae7b63209f1b69b0d763c07aaa64d26571c83df4","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-17 10:09:49 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"get_trunk_by_port_id() RPC for OVS trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC method for getting a trunk by port_id over"},{"line_number":10,"context_line":"RPC. Includes the implementation of one rpc callback:"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":11,"id":"dada55a8_7c95cee2","line":7,"range":{"start_line":7,"start_character":30,"end_line":7,"end_character":47},"in_reply_to":"dada55a8_b4cbf271","updated":"2016-07-18 21:34:53.000000000","message":"Done","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"3f872941a0cb26c2ea486ee5f5054662bef16ef8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-14 13:03:56 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC  server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC for trunk plugin."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"dada55a8_5064f020","line":7,"range":{"start_line":7,"start_character":3,"end_line":7,"end_character":4},"updated":"2016-07-19 22:28:58.000000000","message":"nit: extra space","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"6ad6cc2d726b5c906ba358018dd59f325d4d72b8","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Adolfo Duarte \u003cadolfo.duarte@hpe.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-07-14 13:03:56 -0700"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC  server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC for trunk plugin."},{"line_number":10,"context_line":""}],"source_content_type":"text/x-gerrit-commit-message","patch_set":13,"id":"dada55a8_daff5aa8","line":7,"range":{"start_line":7,"start_character":3,"end_line":7,"end_character":4},"in_reply_to":"dada55a8_5064f020","updated":"2016-07-20 00:35:59.000000000","message":"Done","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"f014a584ccda30dcf01872bc70ea10799a010d5f","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC framework for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"It is left up to the driver to register"},{"line_number":12,"context_line":"the callbacks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dada55a8_99037976","line":9,"updated":"2016-07-23 00:29:58.000000000","message":"After looking at the past review comments, I think there are a couple of things we want to take care of before considering this patch mature for merging:\n\na) define the server side interface and provide a client side stub: we want to do so in such a way that not only the interface is versioned, but even the objects are. To this aim, leveraging the RPC callbacks for basic agent/server communication seems like a sensible thing to do, especially if the building blocks are already in place for needs like simple object lookups.\nb) testing the RPC module: it would be nice to explore how we can test the RPC interface more effectively;\n\nHaving said that, we\u0027d still need to define trunk-owned additional RPC methods that may be specific to agent/server communication for the OVS trunk use case, for instance to tackle binding/status update operations, but those will become clearer during the integration effort with the agent side and can come up as follow up.","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"4f407ea34088a79e216f72ae86e2d0572441fd6b","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC framework for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"It is left up to the driver to register"},{"line_number":12,"context_line":"the callbacks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dada55a8_a0b83512","line":9,"in_reply_to":"dada55a8_99037976","updated":"2016-07-26 23:58:25.000000000","message":"@armando\nwhen you refer to ensuring that both the interface and the objects are versioned are you saying we should use oslo.versioned objects for the rpc payload definition.\n\nnova requires this for all rpc payloads and i think it would help here too but neutron current dose not use oslo.versioned objects(ovo) this way.\n\npersonally i think adopting ovo would be good in this instance but i am curious if that was what you intended.","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"5e8496fa448e82bb8f746bde03992191f0a3ab27","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC framework for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"It is left up to the driver to register"},{"line_number":12,"context_line":"the callbacks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dada55a8_bd8bb267","line":9,"in_reply_to":"dada55a8_99037976","updated":"2016-07-26 23:04:47.000000000","message":"Done","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"},{"author":{"_account_id":11604,"name":"sean mooney","email":"smooney@redhat.com","username":"sean-k-mooney"},"change_message_id":"1227d13005809249c657bc58f16427406e14f43e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC framework for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"It is left up to the driver to register"},{"line_number":12,"context_line":"the callbacks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dada55a8_bb8d087e","line":9,"in_reply_to":"dada55a8_a0a795a5","updated":"2016-07-27 00:30:22.000000000","message":"yep it did thanks :)","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"ac5eeea4b1e7d35519b070f8ca7e92ba42a0920e","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"RPC server side for trunk driver"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Introduces RPC framework for trunk plugin."},{"line_number":10,"context_line":""},{"line_number":11,"context_line":"It is left up to the driver to register"},{"line_number":12,"context_line":"the callbacks."}],"source_content_type":"text/x-gerrit-commit-message","patch_set":17,"id":"dada55a8_a0a795a5","line":9,"in_reply_to":"dada55a8_a0b83512","updated":"2016-07-27 00:07:06.000000000","message":"@Sean: yes, that\u0027s what I mean. Neutron is in the process of moving towards versioned objects and we can leverage them in conjunction with rpc callbacks. I hope that address your comment.","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"}],"neutron/api/rpc/handlers/trunk_rpc.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62a00161df4e2da537f7e0774e4858748774dacf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_a598f21c","line":1,"updated":"2016-07-07 23:51:43.000000000","message":"move this under neutron/services/trunk","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_20ab50d8","line":1,"in_reply_to":"1aa78d24_a598f21c","updated":"2016-07-08 00:06:43.000000000","message":"Done","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"}],"neutron/services/trunk/__init__.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import neutron.services.trunk.drivers  # noqa"},{"line_number":16,"context_line":"import neutron.services.trunk.validators  # noqa"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_7ae8eeb4","line":15,"updated":"2016-07-20 00:40:15.000000000","message":"As Ilya pointed out, we should move the import from here.\n\nI am wondering if the rpc registration is not a responsibility of a driver that requires an RPC backend (I believe it is), and thus moved during the openvswitch driver initialization, the one we\u0027re currently targeting.\n\nEach RPC backend has a namespace/topic (trunk_consts.TRUNK_PLUGIN in this patch) and a driver can decide to share one (like a global one, local to the trunk module) and/or introduce a new one in case it needs custom RPC\u0027s.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"86f15b97a601252c5f199cf86b4bd0013c3aa03e","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import neutron.services.trunk.drivers  # noqa"},{"line_number":16,"context_line":"import neutron.services.trunk.validators  # noqa"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_94ef491d","line":15,"in_reply_to":"dada55a8_7ae8eeb4","updated":"2016-07-20 17:51:12.000000000","message":"I think the RPC interfaces proposed here have utility that is not scoped to a specific driver. I\u0027m thinking we do need a way to load a global RPC endpoint.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0d93363a44142b019009d52eccc2e675866440f2","unresolved":false,"context_lines":[{"line_number":12,"context_line":"#    License for the specific language governing permissions and limitations"},{"line_number":13,"context_line":"#    under the License."},{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import neutron.services.trunk.drivers  # noqa"},{"line_number":16,"context_line":"import neutron.services.trunk.validators  # noqa"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_3d831058","line":15,"in_reply_to":"dada55a8_7ae8eeb4","updated":"2016-07-20 00:49:38.000000000","message":"To elaborate further, I think the purpose of this patch is to introduce an RPC layer that provides remote objects (aka agents) with the ability to integrate with the service plugin. This RPC layer is meant to provide general purpose methods and it can be loaded if there is at least one driver that may require remote communication with the Neutron Server.\n\nDepending on what other methods are required, it can be decided whether they go in the general purpose RPC or it can go into a driver-specific RPC.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c23b857a077f1eafd0923c250c1e2e98826cd7c9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_583977f1","line":1,"updated":"2016-07-20 23:52:20.000000000","message":"be careful about changing file permissions.","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"dbd57bf43b97723b59ca57d63e618dc888cf4d68","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# All Rights Reserved."},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"#    Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"#    not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_d1524166","line":1,"in_reply_to":"dada55a8_583977f1","updated":"2016-07-21 14:25:34.000000000","message":"Done","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"}],"neutron/services/trunk/callbacks.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"11a6d6c3798d1aa493e78faf7232d80b91033fc9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_83e81b18","line":1,"updated":"2016-07-08 19:58:56.000000000","message":"Can we either rename this to rpc_callbacks.py or move it under neutron/services/trunk/rpc?","commit_id":"32a116acd94aaf9eb30e90bc61c6056d664cd1c3"}],"neutron/services/trunk/drivers/__init__.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"11a6d6c3798d1aa493e78faf7232d80b91033fc9","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register segmentation_type validation drivers"},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_03c42b90","line":19,"updated":"2016-07-08 19:58:56.000000000","message":"In neutron/services/trunk/__init__.py we need an explicit import of this module.","commit_id":"32a116acd94aaf9eb30e90bc61c6056d664cd1c3"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"9ee2ef01f769e93a53571f4dc0fa732019557cdf","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company, LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_d9e33004","line":1,"range":{"start_line":1,"start_character":56,"end_line":1,"end_character":63},"updated":"2016-07-08 20:47:22.000000000","message":"nit: I think the latest version of the copyright omits the \u0027Company\u0027","commit_id":"91c7a42648cd3712187ec642928a60f547f45c69"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"69eb289956782bfd74087043f39c16d0f9ee52dc","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_39fd423c","line":16,"updated":"2016-07-13 22:45:11.000000000","message":"this will lead to loading the RPC plumbing even if there\u0027s no consumer or needed at all. We should figure out a way to make this silent in configurations where it is not required, otherwise we\u0027ll be dumping messages on the queue that are never gonna get consumed.","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"3375e033740cad9367cca33e27afa08488bfd5b4","unresolved":false,"context_lines":[{"line_number":13,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":14,"context_line":"# under the License."},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_b7bd8804","line":16,"in_reply_to":"1aa78d24_39fd423c","updated":"2016-07-14 20:37:29.000000000","message":"It is true that this will setup some RPC plumbing, but all it does is expose the server-side RPC interface. No messages will be sent by the server. My thinking is that each driver will somehow filter out the AFTER_CREATE/AFTER_DELETE notifications on subports that aren\u0027t backed the network technology they suport.\n\nie OVS driver would be able to look at a subport notification, look at the associated trunk, determine whether the trunk is serviced by OVS or not, then send notifications accordingly.\n\nThe RPC interface exposed here is actually of use to any backend, so loading it in all cases is actually what we want. To be clear, this does not result in notifications being sent. It only enables an agent to pull trunk information from the server, nothing more.","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"3df9892259c2ecf9457b02a30b5b7ae0d2244eef","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_c22b1aea","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"updated":"2016-07-19 10:21:44.000000000","message":"1. I consider registering callbacks on module import as a very bad idea. Please consider looking at \u0027qos\u0027 plugin [1] for example.\n\n2. I\u0027d like to avoid having non-empty __init__.py when possible\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/services/qos/qos_plugin.py#L42","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"7638687d0c297a31525bf4ebdcfa6aba736d73dc","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_dac0fa2c","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_2735bff6","updated":"2016-07-20 00:20:11.000000000","message":"It did occur to me that this may result in registering of drivers and RPC endpoints when the service plugin isn\u0027t in use. That is clearly a bad thing, so a different solution is needed. The only alternative I am firmly against at this point is config flags in neutron.conf. Loading drivers out of setup.cfg could very well be a viable alternative.","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"9972fd8b4bc7689ba9535d00c83dfe80b6fc987e","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_1aed7225","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_2735bff6","updated":"2016-07-20 00:18:17.000000000","message":"There are a few considerations being made here:\n\na) registering callbacks on module import is a bad idea: callback registration is idempotent and modules are imported once, so that\u0027s good. Now one could argue that registration may be accidental due to importing the trunk module. That\u0027s fair, though one might argue who is going to import the trunk module if not with the objective of using it? If we want to avoid this potential side effect, the way I originally envisioned it was by forcing the callback registration when importing the plugin [1], so we may want to revise this a little. I reckon that causing callback registration on plugin loading is acceptable as I see no users for the plugin, in other words the plugin should be \u0027final\u0027.\n\nb) using entry points: some projects ban pluggable points entirely, some others are completely lax, Neutron is somewhat in the middle, and I would rather tie the ship than make it loose, and for that reason I am not particularly in favor of customizability, especially if that requires extra deployment support.\n\nc) use notification_drivers: callback registry serves the same purpose of notification_drivers with a clear semantic and without the complication of replicating interfaces, invocation loops and entry points. In other words, it\u0027s just as clean if not cleaner.\n\n\n[1] https://review.openstack.org/#/c/333605/1/neutron/services/trunk/plugin.py","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"f4f1b42cf8d9cdff066fb556c6edd4869d8e4a17","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_fa77be37","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_2735bff6","updated":"2016-07-20 00:33:13.000000000","message":"will take a look to qos and try to follow that model","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"f4f1b42cf8d9cdff066fb556c6edd4869d8e4a17","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_81458018","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_b3ec6c90","updated":"2016-07-20 00:33:13.000000000","message":"+1 on Ryan\u0027s comment","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"8a90e646a3173f44c87131bb559220a370d0ebe4","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_2735bff6","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_b3ec6c90","updated":"2016-07-19 23:48:09.000000000","message":"\u003e We\u0027ve been avoiding doing this inside the plugin class so as not to pollute it.\n\nI don\u0027t think that hiding it into module import is a good idea at all.\n\nPlease see how \u0027qos\u0027 handles it. E.g. how they handle \u0027neutron.qos.notification_drivers\u0027 in \u0027/setup.cfg\u0027 and in the plugin. I think it\u0027s a very clean and well decoupled solution and still easy to keep track of what\u0027s going on with plugin/driver loading.","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4e8040c6ba19a321f7fee794757fd16deb6dac79","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_b3ec6c90","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_c22b1aea","updated":"2016-07-19 15:16:27.000000000","message":"What is it about registering callbacks here that is not appealing? We\u0027ve been avoiding doing this inside the plugin class so as not to pollute it.\n\nGiven the strategy we have in place for building drivers to handle different backends (OVS, linuxbridge, etc.), a non-empty __init__.py is not what you will see anyway. This is where we will be registering the driver for OVS and others as we implement them.\n\nIn my mind the ml2_rpc (which is really what this is) is just another driver, it allows us to decouple the RPC callbacks which will handle ML2-specific things from the service plugin. In this case, I believe the qos pattern doesn\u0027t give us the decoupling we\u0027re looking for.","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"c10b6611f7c200a1cfb08248d7dccb4b4e9d2512","unresolved":false,"context_lines":[{"line_number":16,"context_line":"from neutron.services.trunk.drivers import rpc"},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"# Register drivers."},{"line_number":19,"context_line":"rpc.register()"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_fd04d8c0","line":19,"range":{"start_line":19,"start_character":0,"end_line":19,"end_character":14},"in_reply_to":"dada55a8_fa77be37","updated":"2016-07-20 00:51:38.000000000","message":"no, don\u0027t :)","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"}],"neutron/services/trunk/drivers/openvswitch.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"add919f0f61675b41cb07261519509f7b3972317","unresolved":false,"context_lines":[{"line_number":26,"context_line":""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register():"},{"line_number":29,"context_line":"    #TODO(fitoduarte) register for AFTER_INIT once available"},{"line_number":30,"context_line":"    registry.subscribe(handler, trunk_consts.TRUNK_PLUGIN,"},{"line_number":31,"context_line":"                       events.AFTER_CREATE)"},{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f01a36c5","line":29,"updated":"2016-07-11 20:02:35.000000000","message":"Should be changed to AFTER_INIT now. https://review.openstack.org/339761 has merged.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"add919f0f61675b41cb07261519509f7b3972317","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register():"},{"line_number":29,"context_line":"    #TODO(fitoduarte) register for AFTER_INIT once available"},{"line_number":30,"context_line":"    registry.subscribe(handler, trunk_consts.TRUNK_PLUGIN,"},{"line_number":31,"context_line":"                       events.AFTER_CREATE)"},{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1091c2f1","line":30,"range":{"start_line":30,"start_character":32,"end_line":30,"end_character":57},"updated":"2016-07-11 20:02:35.000000000","message":"I wonder if this should be trunk_consts.TRUNK_PLUGIN + \u0027-OVS\u0027. I could imagine different drivers wanting to expose the same RPC method. Appending a suffix would allow each driver to expose its own endpoint.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0ce3ef4a41cfdf2ddcc12be29af3842a2d24c6e2","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register():"},{"line_number":29,"context_line":"    #TODO(fitoduarte) register for AFTER_INIT once available"},{"line_number":30,"context_line":"    registry.subscribe(handler, trunk_consts.TRUNK_PLUGIN,"},{"line_number":31,"context_line":"                       events.AFTER_CREATE)"},{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_73d48b1f","line":30,"range":{"start_line":30,"start_character":32,"end_line":30,"end_character":57},"in_reply_to":"1aa78d24_1091c2f1","updated":"2016-07-11 22:27:45.000000000","message":"Oops, I meant to put this comment on L37. trunk_consts.TRUNK_PLUGIN is correct on this line.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5a35ffd8b80d50ff85953f8847d9df8e6e027321","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register():"},{"line_number":29,"context_line":"    #TODO(fitoduarte) register for AFTER_INIT once available"},{"line_number":30,"context_line":"    registry.subscribe(handler, trunk_consts.TRUNK_PLUGIN,"},{"line_number":31,"context_line":"                       events.AFTER_CREATE)"},{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1d1368b9","line":30,"range":{"start_line":30,"start_character":32,"end_line":30,"end_character":57},"in_reply_to":"1aa78d24_5a797681","updated":"2016-07-12 15:36:53.000000000","message":"The thinking is that the RPC can\u0027t really be invoked until the service plugin has finished its initialization.\n\nIn terms of endpoints, what happens if we\u0027re using linuxbridge (as an example) and the agent expects to call get_trunk_by_port_id RPC? Wouldn\u0027t the OVS agent get invoked. I\u0027m scratching my head over this scenario. I don\u0027t fully understand the RPC internals, I\u0027ve never ventured into it too deeply.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":6788,"name":"Rossella Sblendido","email":"rsblendido@suse.com","username":"rossella-o"},"change_message_id":"264df1a343c49909df38f905082933e2bc4d4c0b","unresolved":false,"context_lines":[{"line_number":27,"context_line":""},{"line_number":28,"context_line":"def register():"},{"line_number":29,"context_line":"    #TODO(fitoduarte) register for AFTER_INIT once available"},{"line_number":30,"context_line":"    registry.subscribe(handler, trunk_consts.TRUNK_PLUGIN,"},{"line_number":31,"context_line":"                       events.AFTER_CREATE)"},{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"},{"line_number":33,"context_line":""}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_5a797681","line":30,"range":{"start_line":30,"start_character":32,"end_line":30,"end_character":57},"in_reply_to":"1aa78d24_73d48b1f","updated":"2016-07-12 15:26:53.000000000","message":"different drivers should not have different endpoints. Anyway I don\u0027t get this line, why do we need to subscribe to event of the trunk plugin to run the rpc initialization? we will have to configure somewhere that we are using the ovs driver, so we should move lines 36-38 here and run them at initialization","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"8908960908239f858c2883296f09b1501efca686","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    LOG.debug(\u0027Registering for trunk support\u0027)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def handler(*args, **kwargs):"},{"line_number":36,"context_line":"    conn \u003d n_rpc.create_connection()"},{"line_number":37,"context_line":"    conn.create_consumer(trunk_consts.TRUNK_PLUGIN,"},{"line_number":38,"context_line":"                         [trunk_callbacks.TrunkRpcCallback()],"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_1dbc3605","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":11},"updated":"2016-07-11 21:26:33.000000000","message":"maybe rename to rpc_setup_handler(). There will be other handler methods in this module, handler will be a little ambiguous going forward.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"0ce3ef4a41cfdf2ddcc12be29af3842a2d24c6e2","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def handler(*args, **kwargs):"},{"line_number":36,"context_line":"    conn \u003d n_rpc.create_connection()"},{"line_number":37,"context_line":"    conn.create_consumer(trunk_consts.TRUNK_PLUGIN,"},{"line_number":38,"context_line":"                         [trunk_callbacks.TrunkRpcCallback()],"},{"line_number":39,"context_line":"                         fanout\u003dFalse)"},{"line_number":40,"context_line":"    conn.consume_in_threads()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_d3cc5f8b","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":50},"updated":"2016-07-11 22:27:45.000000000","message":"Disregard my comment at L30, I meant to put it here.\n\nI wonder if this should be trunk_consts.TRUNK_PLUGIN + \u0027-OVS\u0027. I could imagine different drivers wanting to expose the same RPC method. Appending a suffix would allow each driver to expose its own endpoint.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d7a0ef371872dc0848261e702dc94184dc0a48ca","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def handler(*args, **kwargs):"},{"line_number":36,"context_line":"    conn \u003d n_rpc.create_connection()"},{"line_number":37,"context_line":"    conn.create_consumer(trunk_consts.TRUNK_PLUGIN,"},{"line_number":38,"context_line":"                         [trunk_callbacks.TrunkRpcCallback()],"},{"line_number":39,"context_line":"                         fanout\u003dFalse)"},{"line_number":40,"context_line":"    conn.consume_in_threads()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f6d03621","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":50},"in_reply_to":"1aa78d24_3f38d4ed","updated":"2016-07-12 17:44:49.000000000","message":"In this case the RPC method we\u0027re exposing is actually of utility to any agent. At the moment I can\u0027t think of what specialized RPC interfaces that need to be exposed. I guess for the time being that means generalizing the approach and not doing something OVS-specific.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"2feb2709deb11ba06cd302e4526444e5fdc65d5a","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def handler(*args, **kwargs):"},{"line_number":36,"context_line":"    conn \u003d n_rpc.create_connection()"},{"line_number":37,"context_line":"    conn.create_consumer(trunk_consts.TRUNK_PLUGIN,"},{"line_number":38,"context_line":"                         [trunk_callbacks.TrunkRpcCallback()],"},{"line_number":39,"context_line":"                         fanout\u003dFalse)"},{"line_number":40,"context_line":"    conn.consume_in_threads()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_3f38d4ed","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":50},"in_reply_to":"1aa78d24_bfa7a44e","updated":"2016-07-12 17:16:00.000000000","message":"Let\u0027s consider for a second what we really need here. If the end up having an endpoint per driver we may want to have a common one and a specialized one.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a6bb209fbc3299a19ff03dc5fe3e86689f347197","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def handler(*args, **kwargs):"},{"line_number":36,"context_line":"    conn \u003d n_rpc.create_connection()"},{"line_number":37,"context_line":"    conn.create_consumer(trunk_consts.TRUNK_PLUGIN,"},{"line_number":38,"context_line":"                         [trunk_callbacks.TrunkRpcCallback()],"},{"line_number":39,"context_line":"                         fanout\u003dFalse)"},{"line_number":40,"context_line":"    conn.consume_in_threads()"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_bfa7a44e","line":37,"range":{"start_line":37,"start_character":25,"end_line":37,"end_character":50},"in_reply_to":"1aa78d24_d3cc5f8b","updated":"2016-07-12 17:13:43.000000000","message":"At this point the plugin initialization is complete no?","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"}],"neutron/services/trunk/drivers/rpc.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"11a6d6c3798d1aa493e78faf7232d80b91033fc9","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company, LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":3,"id":"1aa78d24_43b9132e","line":1,"updated":"2016-07-08 19:58:56.000000000","message":"Can we rename this to openvswitch.py? This is where all of the OVS specific logic will live. Each backend (OVN ,linuxbridge, etc.) will provide it\u0027s own driver that looks similar to this. It just so happens that the only thing the OVS driver needs to do at the moment is register an RPC endpoint. The RPC endpoint is specific to the OVS driver. We will fill this out with notification handlers to deal with the RPC push out to the agent with some follow-up patches.","commit_id":"32a116acd94aaf9eb30e90bc61c6056d664cd1c3"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"10b7167d9a8ba1f61d82315723f54bf29f43172d","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company, LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_b512b960","line":1,"updated":"2016-07-18 23:57:04.000000000","message":"nit: is this all ML2-specific? Should we maybe rename to ml2_rpc?","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"f4f1b42cf8d9cdff066fb556c6edd4869d8e4a17","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Development Company, LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# All Rights Reserved."},{"line_number":4,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_2192d49e","line":1,"in_reply_to":"dada55a8_b512b960","updated":"2016-07-20 00:33:13.000000000","message":"Valid point.  Lets think about it some more. with more changes coming will probably want to rethink filenames","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"}],"neutron/services/trunk/exceptions.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62a00161df4e2da537f7e0774e4858748774dacf","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                \"eligible for use as a parent port.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class TrunkInUse(n_exc.InUse):"},{"line_number":68,"context_line":"    message \u003d _(\"Trunk %(trunk_id)s is currently in use.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_65f8ca4a","line":67,"updated":"2016-07-07 23:51:43.000000000","message":"bad rebase?","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":64,"context_line":"                \"eligible for use as a parent port.\")"},{"line_number":65,"context_line":""},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"class TrunkInUse(n_exc.InUse):"},{"line_number":68,"context_line":"    message \u003d _(\"Trunk %(trunk_id)s is currently in use.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_00a45406","line":67,"in_reply_to":"1aa78d24_65f8ca4a","updated":"2016-07-08 00:06:43.000000000","message":"Done","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"}],"neutron/services/trunk/plugin.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62a00161df4e2da537f7e0774e4858748774dacf","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._segmentation_types \u003d {}"},{"line_number":42,"context_line":"        #TODO(tidwellr) notify using events.AFTER_INIT once available"},{"line_number":43,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_CREATE, self)"},{"line_number":44,"context_line":"        self._setup_rpc()"},{"line_number":45,"context_line":"        LOG.debug(\u0027Trunk plugin loaded\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def add_segmentation_type(self, segmentation_type, id_validator):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_45882ec7","line":44,"updated":"2016-07-07 23:51:43.000000000","message":"this does not belong here, but encapsulated in its own driver. Ryan will be able to guide you further. That\u0027s because not every service plugin consumer may rely on RPC/agents.","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":41,"context_line":"        self._segmentation_types \u003d {}"},{"line_number":42,"context_line":"        #TODO(tidwellr) notify using events.AFTER_INIT once available"},{"line_number":43,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_CREATE, self)"},{"line_number":44,"context_line":"        self._setup_rpc()"},{"line_number":45,"context_line":"        LOG.debug(\u0027Trunk plugin loaded\u0027)"},{"line_number":46,"context_line":""},{"line_number":47,"context_line":"    def add_segmentation_type(self, segmentation_type, id_validator):"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_608c3880","line":44,"in_reply_to":"1aa78d24_45882ec7","updated":"2016-07-08 00:06:43.000000000","message":"will do thanks.","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62a00161df4e2da537f7e0774e4858748774dacf","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def get_plugin_type(cls):"},{"line_number":68,"context_line":"        return \"trunk\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _setup_rpc(self):"},{"line_number":71,"context_line":"        self.topic \u003d constants.TRUNK_PLUGIN"},{"line_number":72,"context_line":"        self.conn \u003d n_rpc.create_connection()"},{"line_number":73,"context_line":"        self.endpoints \u003d [trunk_rpc.TrunkRpcCallback()]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_258522ad","line":70,"updated":"2016-07-07 23:51:43.000000000","message":"ditto.","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":67,"context_line":"    def get_plugin_type(cls):"},{"line_number":68,"context_line":"        return \"trunk\""},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"    def _setup_rpc(self):"},{"line_number":71,"context_line":"        self.topic \u003d constants.TRUNK_PLUGIN"},{"line_number":72,"context_line":"        self.conn \u003d n_rpc.create_connection()"},{"line_number":73,"context_line":"        self.endpoints \u003d [trunk_rpc.TrunkRpcCallback()]"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_209230a0","line":70,"in_reply_to":"1aa78d24_258522ad","updated":"2016-07-08 00:06:43.000000000","message":"will do thanks","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"62a00161df4e2da537f7e0774e4858748774dacf","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":89,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":90,"context_line":"    def get_trunk_with_port_id(self, context, port_id, fields\u003dNone):"},{"line_number":91,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":92,"context_line":"        obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":93,"context_line":"        if obj is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_e5b95a7b","line":90,"updated":"2016-07-07 23:51:43.000000000","message":"this  method does not belong here.","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"cb10d97334d269d0706f291187ee81039f0b5478","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":89,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":90,"context_line":"    def get_trunk_with_port_id(self, context, port_id, fields\u003dNone):"},{"line_number":91,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":92,"context_line":"        obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":93,"context_line":"        if obj is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_c09fec63","line":90,"in_reply_to":"1aa78d24_c0d1ac31","updated":"2016-07-08 00:09:20.000000000","message":"What is this method for? Who calls it? We should limit this file to contain contain implementation for REST facing APIs","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":89,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":90,"context_line":"    def get_trunk_with_port_id(self, context, port_id, fields\u003dNone):"},{"line_number":91,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":92,"context_line":"        obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":93,"context_line":"        if obj is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_00c9f4ac","line":90,"in_reply_to":"1aa78d24_e5b95a7b","updated":"2016-07-08 00:06:43.000000000","message":"I imagine you mean it belongs in encapsulated in its own driver as you pointed out above?","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"77f1b702680f195d2bf2aa4d8039d17eb84fc9d5","unresolved":false,"context_lines":[{"line_number":87,"context_line":""},{"line_number":88,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":89,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":90,"context_line":"    def get_trunk_with_port_id(self, context, port_id, fields\u003dNone):"},{"line_number":91,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":92,"context_line":"        obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":93,"context_line":"        if obj is None:"}],"source_content_type":"text/x-python","patch_set":1,"id":"1aa78d24_c0d1ac31","line":90,"in_reply_to":"1aa78d24_e5b95a7b","updated":"2016-07-08 00:06:43.000000000","message":"You mean it belongs encapsulated in its own driver as well? \nIf not where? it seems very similar in functionality to the one above \"get_trunk\".","commit_id":"4daa06de041605c9c52b7c6b179b2257d20c230e"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"5851f66596ae4c5150d1c6e219cc4e45e81388ec","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self._segmentation_types \u003d {}"},{"line_number":42,"context_line":"        #TODO(tidwellr) notify using events.AFTER_INIT once available"},{"line_number":43,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_CREATE, self)"},{"line_number":44,"context_line":"        self._setup_rpc()"},{"line_number":45,"context_line":"        LOG.debug(\u0027Trunk plugin loaded\u0027)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_d50e5ee4","line":43,"range":{"start_line":43,"start_character":55,"end_line":43,"end_character":67},"updated":"2016-07-08 17:26:19.000000000","message":"Not sure if we should do it in this patch, but this should be changed to AFTER_INIT since I\u0027m pretty sure that change has merged now.","commit_id":"aed8d51f7cb96683ad6e2efa1bd9d59bb909b105"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"0f539e0a5073e20562110aebdedec94f79f874e6","unresolved":false,"context_lines":[{"line_number":40,"context_line":"    def __init__(self):"},{"line_number":41,"context_line":"        self._segmentation_types \u003d {}"},{"line_number":42,"context_line":"        #TODO(tidwellr) notify using events.AFTER_INIT once available"},{"line_number":43,"context_line":"        registry.notify(constants.TRUNK_PLUGIN, events.AFTER_CREATE, self)"},{"line_number":44,"context_line":"        self._setup_rpc()"},{"line_number":45,"context_line":"        LOG.debug(\u0027Trunk plugin loaded\u0027)"},{"line_number":46,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1aa78d24_db25ed5c","line":43,"range":{"start_line":43,"start_character":55,"end_line":43,"end_character":67},"in_reply_to":"1aa78d24_d50e5ee4","updated":"2016-07-08 18:03:27.000000000","message":"I\u0027ll do it in a follow up.","commit_id":"aed8d51f7cb96683ad6e2efa1bd9d59bb909b105"}],"neutron/services/trunk/rpc/callbacks.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"fefd5b5fd2b169903074fd984935985584383e0d","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import oslo_messaging"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron.common import rpc as n_rpc"},{"line_number":19,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":20,"context_line":"from neutron.objects import trunk as trunk_objects"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_0f931bfb","line":17,"updated":"2016-07-21 11:42:58.000000000","message":"Nit: Additional empty line","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"dbd57bf43b97723b59ca57d63e618dc888cf4d68","unresolved":false,"context_lines":[{"line_number":14,"context_line":""},{"line_number":15,"context_line":"import oslo_messaging"},{"line_number":16,"context_line":""},{"line_number":17,"context_line":""},{"line_number":18,"context_line":"from neutron.common import rpc as n_rpc"},{"line_number":19,"context_line":"from neutron.db import db_base_plugin_common"},{"line_number":20,"context_line":"from neutron.objects import trunk as trunk_objects"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_31e59da7","line":17,"in_reply_to":"dada55a8_0f931bfb","updated":"2016-07-21 14:25:34.000000000","message":"Done","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"fefd5b5fd2b169903074fd984935985584383e0d","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027,"},{"line_number":33,"context_line":"                                   namespace\u003dconstants.TRUNK_BASE_NAMESPACE)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":38,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_cf574356","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":49},"updated":"2016-07-21 11:42:58.000000000","message":"This decorator serves only for returning from server API to clients. This data goes to rpc so object should be dehydrated.\n\n trunk_port \u003d trunk_objects.Trunk.get_object(...)\n return trunk_port.obj_to_primitive()","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"dbd57bf43b97723b59ca57d63e618dc888cf4d68","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027,"},{"line_number":33,"context_line":"                                   namespace\u003dconstants.TRUNK_BASE_NAMESPACE)"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":38,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_916f29fb","line":35,"range":{"start_line":35,"start_character":4,"end_line":35,"end_character":49},"in_reply_to":"dada55a8_cf574356","updated":"2016-07-21 14:25:34.000000000","message":"Done","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"a7544351003ad98449e48608f84f2c641e4ae0f3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TrunkRpcCallback(object):"},{"line_number":26,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # API version history:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_781fcdb7","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"updated":"2016-07-22 08:42:49.000000000","message":"Looking at what it does, why can\u0027t we re-use the pull method for resource_rpc? https://github.com/openstack/neutron/blob/master/neutron/api/rpc/handlers/resources_rpc.py#L117 It seems we\u0027re re-implementing the methods here.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"3fd9590d5b0615b4b53ac4e40d55be5b24af5f38","unresolved":false,"context_lines":[{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TrunkRpcCallback(object):"},{"line_number":26,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # API version history:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_4e25c3ac","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"in_reply_to":"dada55a8_2a5e8076","updated":"2016-07-22 17:12:23.000000000","message":"@Adolfo, \u0027port_id\u0027 could be used as \u0027resource_id\u0027 (there\u0027s no restriction on what \u0027resource_id\u0027 is supposed to be; e.g. [1]), but we can only have one of \u0027port_id\u0027 or \u0027trunk_id\u0027 as \u0027resource_id\u0027.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/services/qos/notification_drivers/message_queue.py#L27-L37","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"650352962aa6ab0150a12918672572be1658ab46","unresolved":false,"context_lines":[{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TrunkRpcCallback(object):"},{"line_number":26,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # API version history:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_947b4e7b","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"in_reply_to":"dada55a8_4e25c3ac","updated":"2016-07-22 18:34:40.000000000","message":"@Ilya: forgive my ignorance on the matter but I\u0027m still not seeing what the difference (except code location) on the example you quoted. \n\nThe resource here is the Trunk, which means the resource id we can pass into resources_rpx.py#L117 is the id, which is the \"trunk_id\".  If I am following this correctly in order to be able to pass in \"port_id\" we would have to add code like the one you quote in [1]... which is what this patch does. \n\nSo, I guess the part I am missing is how do we implement get_trunk_by_port_id using only resources_rpc.py#L117 and no more extra code. if we can do that, that would be great.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3896aada8e15be14b70a9d589f9233cb029d2a9d","unresolved":false,"context_lines":[{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TrunkRpcCallback(object):"},{"line_number":26,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # API version history:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_783a04e9","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"in_reply_to":"dada55a8_781fcdb7","updated":"2016-07-22 22:11:51.000000000","message":"@Jakub: I think there is a fair degree of reuse that can be made, especially in relation to dealing with object versioning (i.e. the agent seamlessly asking for versioned copy of the object). In this current proposal, the RPC call is versioned but the object isn\u0027t, and we should address this.\n\nHow easy it is to tackle now/or as a follow-up? Perhaps you can help shape this the way you see it? Any chance you can provide more pointers/examples to look at?","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"6a25ef2e4ff51e24acc98ef70d9a3f59761948a3","unresolved":false,"context_lines":[{"line_number":22,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"class TrunkRpcCallback(object):"},{"line_number":26,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations.\"\"\""},{"line_number":27,"context_line":""},{"line_number":28,"context_line":"    # API version history:"}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_2a5e8076","line":25,"range":{"start_line":25,"start_character":6,"end_line":25,"end_character":22},"in_reply_to":"dada55a8_781fcdb7","updated":"2016-07-22 16:02:30.000000000","message":"perhaps for get_trunk_by_id,  but I am not too sure about get_trunk_by_port_id.  port_id is not the resource_id. Its another field in the object.  In order to implement something like get_trunk_by_port_id, the agent would have to query for all trunks and then go one by one looking for the port_id. \n\nIf anything we can take out get_trunk_by_id, but it would be a bit cumbersome since the agent would have to make calls to two different namespaces.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"1f59862512c57039baf06de79455f46a85a1705a","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_14a15046","line":42,"updated":"2016-07-21 22:12:38.000000000","message":"This returns the OVO, not a dict. Is this really what we want to send to the agent? Is the intent with OVO to take the place of loosely structured dicts that get passed around? I\u0027m not sure whether we want to go there. A little clarity on this point would be helpful.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"a3bd73222a98e10432056ec88b9d68e4ef4a0e0e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_42174f54","line":42,"in_reply_to":"dada55a8_0a873c13","updated":"2016-07-22 21:01:20.000000000","message":"If we want to properly handle upgrade scenarios I think we must.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"5709c6909b304066b563a1c652fe29d998cdf142","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_78c34d39","line":42,"in_reply_to":"dada55a8_14a15046","updated":"2016-07-22 08:38:07.000000000","message":"Yes, this dehydrates the object so we\u0027re able to send it over the wire. The client on the other side then hydrates the object back calling obj_from_primitive(dehydrated_data). I think it becomes a lot clearer once client side implementation is in place.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"7624440ad1c2b8ca2e511bd00658e89062bbc62e","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_d30e72e4","line":42,"in_reply_to":"dada55a8_42174f54","updated":"2016-07-22 22:35:12.000000000","message":"OK, you\u0027d think I would be up to speed on versioned objects by now and what we\u0027re accomplishing with them. That answers my question.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"dde52e39edd55970100b2c50c931071a55611051","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_0a873c13","line":42,"in_reply_to":"dada55a8_78c34d39","updated":"2016-07-22 15:58:22.000000000","message":"I understand how this works, my question is whether we really want OVO to become so pervasive. My question is really about whether we want to be using OVO up and down the stack at every layer.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10c3f7aecd1c5095508da5c7da66896bc2614b5d","unresolved":false,"context_lines":[{"line_number":39,"context_line":"        \"\"\""},{"line_number":40,"context_line":"        trunk_obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":41,"context_line":"        if trunk_obj:"},{"line_number":42,"context_line":"            return trunk_obj.obj_to_primitive()"},{"line_number":43,"context_line":""},{"line_number":44,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":45,"context_line":"        \"\"\"Return information for the specified trunk with given id."}],"source_content_type":"text/x-python","patch_set":16,"id":"dada55a8_b9459d18","line":42,"in_reply_to":"dada55a8_d30e72e4","updated":"2016-07-23 00:11:53.000000000","message":"That\u0027s ok :)\n\nI think here we\u0027re missing the version id of the object, so that the agent receives the object in a format it understands.","commit_id":"fae2b93f34db8e04525a0296b03c98723d6f865f"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"16aa798364187903d8007e64f57fa935c1d44b5f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027,"},{"line_number":31,"context_line":"                                   namespace\u003dconstants.TRUNK_BASE_NAMESPACE)"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":34,"context_line":"        \"\"\"Return information for the specified trunk with given port_id."},{"line_number":35,"context_line":""},{"line_number":36,"context_line":"        :param context: rpc context"}],"source_content_type":"text/x-python","patch_set":17,"id":"dada55a8_f5b16ce1","line":33,"updated":"2016-07-26 14:20:51.000000000","message":"you don\u0027t need to do that, if you want to expose a neutron object via rpc callbacks you can just do:\n\n    from neutron.api.rpc.callbacks.producer import registry\n\n\n    def _get_trunk_port_cb(resource, port_id, **kwargs):\n    context \u003d kwargs.get(\u0027context\u0027)\n    if context is None:\n        LOG.warning(_LW(\n            \u0027Received %(resource)s %(port_id)s without context\u0027),\n            {\u0027resource\u0027: resource, \u0027port_id\u0027: port_id}\n        )\n        return\n\n    trunk_port \u003d trunk_objects.Trunk.get_object(context, id\u003dport_id)\n    return trunk_port\n\n\n    and register yourself as a provider with: \n      registry.provide(_get_trunk_port_cb, resources.TRUNK_PORT)\n\n\nAnd then the agent side can pull them with:\n\n self.resource_rpc \u003d resources_rpc.ResourcesPullRpcApi()\n\n trunk_port \u003d self.resource_rpc.pull(\n            context, resources.TRUNK_PORT, trunk_port_id)\n\nThis interface will also take care of the differences between the agent version of the objects, and the server side version of the objects.\n\n\nThis is agent pull of objects. You can also push object updates from server to agent if you wanted (with all the versioning issues during upgrades handled for you).","commit_id":"c9f9d141126bcb01c34051fbfd1b35c3d48002b1"}],"neutron/services/trunk/rpc_callbacks.py":[{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"fdd618e38d0ceb5def0e01fdf1f8bfb426c5f30c","unresolved":false,"context_lines":[{"line_number":29,"context_line":""},{"line_number":30,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":31,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":32,"context_line":"    def get_trunk_with_port_id(self, context, port_id, fields\u003dNone):"},{"line_number":33,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":34,"context_line":"        obj \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":35,"context_line":"        if obj is None:"}],"source_content_type":"text/x-python","patch_set":4,"id":"1aa78d24_def4b688","line":32,"range":{"start_line":32,"start_character":55,"end_line":32,"end_character":61},"updated":"2016-07-08 20:31:20.000000000","message":"No need to pass fields here. port_id is the only field we need :)","commit_id":"91c7a42648cd3712187ec642928a60f547f45c69"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"ae483877ff61fe992a7771e3ae323a37e5414e24","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"class TrunkRpcCallback(object):"},{"line_number":23,"context_line":"    \"\"\"Trunkt service plugin RPC callback implementations. \"\"\""},{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    # API version history:"},{"line_number":26,"context_line":"    # 1.0 Initial version"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_c1de566c","line":23,"range":{"start_line":23,"start_character":7,"end_line":23,"end_character":13},"updated":"2016-07-11 17:36:20.000000000","message":"sp: Trunk","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bcb72133c4ae254acf870cbd2219fb114988c97f","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":"    # API version history:"},{"line_number":26,"context_line":"    # 1.0 Initial version"},{"line_number":27,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027)"},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":30,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_9f70e841","line":27,"updated":"2016-07-12 17:12:05.000000000","message":"shouldn\u0027t this need a namespace?","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bcb72133c4ae254acf870cbd2219fb114988c97f","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":32,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":33,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":34,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_ff880c24","line":34,"updated":"2016-07-12 17:12:05.000000000","message":"I think this interface is incomplete: the agent will need to report back on how the trunk has been setup (eg. updating port status resources etc). So perhaps let\u0027s make this clear in the commit message if you don\u0027t intend to continue with the server side definition of the RPC interface?","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"d7a0ef371872dc0848261e702dc94184dc0a48ca","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":32,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":33,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":34,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":7,"id":"1aa78d24_f6df9666","line":34,"in_reply_to":"1aa78d24_ff880c24","updated":"2016-07-12 17:44:49.000000000","message":"It is incomplete. The intent here is to build out the interface in chunks. We want to simply expose a getter for the agent here, nothing more. An updated commit message is probably in order.","commit_id":"45288a9ffa75b639e027ea82de51df81f0e2eb22"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"69eb289956782bfd74087043f39c16d0f9ee52dc","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":33,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":34,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":35,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":36,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_39c5423d","line":35,"updated":"2016-07-13 22:45:11.000000000","message":"why do we wait? This TODO makes no sense.","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0f1f86fb5f5035dce585f0eb2b1745416352a2d0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":33,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":34,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":35,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":36,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fad55976_dbed0927","line":35,"in_reply_to":"1aa78d24_39c5423d","updated":"2016-07-17 09:58:02.000000000","message":"When a request comes in with a port_id which is NOT associated with any existing trunk. The reply to the servers is simply \"None\".   In case of debugging the logs don\u0027t provide enough information. Something should be logged stating that a request came in and that no Trunk was found. It\u0027s just being nice to the user. But perhaps the logs generated are enough already. Will test and see","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"3375e033740cad9367cca33e27afa08488bfd5b4","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":33,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":34,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":35,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":36,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"1aa78d24_774a0029","line":35,"in_reply_to":"1aa78d24_39c5423d","updated":"2016-07-14 20:37:29.000000000","message":"Yeah, not sure what we even would log here.","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"0f1f86fb5f5035dce585f0eb2b1745416352a2d0","unresolved":false,"context_lines":[{"line_number":32,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":33,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":34,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":35,"context_line":"        # TODO(fitoduarte): add meaningful logging."},{"line_number":36,"context_line":"        return trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"}],"source_content_type":"text/x-python","patch_set":8,"id":"fad55976_1c4e1096","line":35,"in_reply_to":"1aa78d24_774a0029","updated":"2016-07-17 09:58:02.000000000","message":"We need to log when a trunk cannot be found with the given port_id \"None\" is returned to the agent. This scenario should be logged.","commit_id":"c79ab919aa3863542d0b3d4e12a2ff9757c2367c"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a9bb9e7f91191eb96f26444ccccb0a4d792b1619","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":38,"context_line":"        if trunk:"},{"line_number":39,"context_line":"            return trunk"},{"line_number":40,"context_line":"        LOG.debug(\"No trunk could be found with port_id: %s\" % port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_33b6efdc","line":40,"updated":"2016-07-18 17:56:21.000000000","message":"For pep8 purposes, this should be:\n\nLOG.debug(\"No trunk could be found with port_id: %s\", port_id)","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ae7b63209f1b69b0d763c07aaa64d26571c83df4","unresolved":false,"context_lines":[{"line_number":37,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":38,"context_line":"        if trunk:"},{"line_number":39,"context_line":"            return trunk"},{"line_number":40,"context_line":"        LOG.debug(\"No trunk could be found with port_id: %s\" % port_id)"}],"source_content_type":"text/x-python","patch_set":11,"id":"dada55a8_36e37ca5","line":40,"in_reply_to":"dada55a8_33b6efdc","updated":"2016-07-18 21:34:53.000000000","message":"Done","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"a9bb9e7f91191eb96f26444ccccb0a4d792b1619","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"dada55a8_53b0c3f4","line":41,"updated":"2016-07-18 17:56:21.000000000","message":"Should we also expose a method along the lines of get_trunk_by_id() in case the agent has the trunk ID? Or is get_trunk_by_port_id() sufficient?","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"ae7b63209f1b69b0d763c07aaa64d26571c83df4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":11,"id":"dada55a8_76f33474","line":41,"in_reply_to":"dada55a8_53b0c3f4","updated":"2016-07-18 21:34:53.000000000","message":"easy enough to add","commit_id":"9a72f81d8a3414581c262a0147df9710dcf8f12b"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"3df9892259c2ecf9457b02a30b5b7ae0d2244eef","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":38,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":39,"context_line":"        if trunk:"},{"line_number":40,"context_line":"            return trunk"},{"line_number":41,"context_line":"        LOG.debug(\"No trunk could be found with port_id: %s\", port_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":44,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_dfe656b3","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":70},"updated":"2016-07-19 10:21:44.000000000","message":"nit: I\u0027d swap log and return here (i.e. replace \u0027if trunk\u0027 with \u0027if not trunk\u0027). I prefer to have a single \u0027return\u0027 at the end of function if possible.","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"f4f1b42cf8d9cdff066fb556c6edd4869d8e4a17","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":38,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":39,"context_line":"        if trunk:"},{"line_number":40,"context_line":"            return trunk"},{"line_number":41,"context_line":"        LOG.debug(\"No trunk could be found with port_id: %s\", port_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":44,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_c1e3f803","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":70},"in_reply_to":"dada55a8_9364c822","updated":"2016-07-20 00:33:13.000000000","message":"Done","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"4e8040c6ba19a321f7fee794757fd16deb6dac79","unresolved":false,"context_lines":[{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""},{"line_number":38,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, port_id\u003dport_id)"},{"line_number":39,"context_line":"        if trunk:"},{"line_number":40,"context_line":"            return trunk"},{"line_number":41,"context_line":"        LOG.debug(\"No trunk could be found with port_id: %s\", port_id)"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":44,"context_line":"    @db_base_plugin_common.convert_result_to_dict"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_9364c822","line":41,"range":{"start_line":39,"start_character":0,"end_line":41,"end_character":70},"in_reply_to":"dada55a8_dfe656b3","updated":"2016-07-19 15:16:27.000000000","message":"Agreed, this does look a little strange to read.","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":21273,"name":"Ilya Chukhnakov","email":"Ilya.chukhnakov@gmail.com","username":"ichukhnakov"},"change_message_id":"3df9892259c2ecf9457b02a30b5b7ae0d2244eef","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""},{"line_number":47,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":48,"context_line":"        if trunk:"},{"line_number":49,"context_line":"            return trunk"},{"line_number":50,"context_line":"        LOG.debug(\"No trunk could be found with id: %s\", trunk_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_7f1e4964","line":50,"range":{"start_line":48,"start_character":0,"end_line":50,"end_character":66},"updated":"2016-07-19 10:21:44.000000000","message":"nit: ditto","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"f4f1b42cf8d9cdff066fb556c6edd4869d8e4a17","unresolved":false,"context_lines":[{"line_number":45,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""},{"line_number":47,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":48,"context_line":"        if trunk:"},{"line_number":49,"context_line":"            return trunk"},{"line_number":50,"context_line":"        LOG.debug(\"No trunk could be found with id: %s\", trunk_id)"}],"source_content_type":"text/x-python","patch_set":12,"id":"dada55a8_21f3f4d7","line":50,"range":{"start_line":48,"start_character":0,"end_line":50,"end_character":66},"in_reply_to":"dada55a8_7f1e4964","updated":"2016-07-20 00:33:13.000000000","message":"Done","commit_id":"de1cfa719ba41eb31257552e07432c230cfe97ab"},{"author":{"_account_id":16800,"name":"Rawlin Peters","email":"rawlin.peters@hpe.com","username":"rawlin"},"change_message_id":"90f20bda9a0b17079e8c944188cea85105d47599","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_50bd1067","line":1,"range":{"start_line":1,"start_character":44,"end_line":1,"end_character":51},"updated":"2016-07-19 22:28:14.000000000","message":"You lost the wrong word here","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"6ad6cc2d726b5c906ba358018dd59f325d4d72b8","unresolved":false,"context_lines":[{"line_number":1,"context_line":"# Copyright 2016 Hewlett Packard Enterprise Company LP"},{"line_number":2,"context_line":"#"},{"line_number":3,"context_line":"# Licensed under the Apache License, Version 2.0 (the \"License\"); you may"},{"line_number":4,"context_line":"# not use this file except in compliance with the License. You may obtain"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_fa04dec0","line":1,"range":{"start_line":1,"start_character":44,"end_line":1,"end_character":51},"in_reply_to":"dada55a8_50bd1067","updated":"2016-07-20 00:35:59.000000000","message":"Done","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TrunkRpcCallback(object):"},{"line_number":27,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations. \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # API version history:"},{"line_number":30,"context_line":"    # 1.0 Initial version"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_1a08d290","line":27,"updated":"2016-07-20 00:40:15.000000000","message":"nit: extra space","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3b03e0d157e9cec2bc7a2a4b4fbbe6fc1ef6b85e","unresolved":false,"context_lines":[{"line_number":24,"context_line":""},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"class TrunkRpcCallback(object):"},{"line_number":27,"context_line":"    \"\"\"Trunk service plugin RPC callback implementations. \"\"\""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"    # API version history:"},{"line_number":30,"context_line":"    # 1.0 Initial version"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_5df7e4f4","line":27,"in_reply_to":"dada55a8_1a08d290","updated":"2016-07-20 00:49:17.000000000","message":"Done","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027,"},{"line_number":32,"context_line":"                                   namespace\u003dtrunk_consts.TRUNK_PLUGIN)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":35,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_baf9c682","line":34,"updated":"2016-07-20 00:40:15.000000000","message":"do we need filter_fields here? I wouldn\u0027t think so.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3b03e0d157e9cec2bc7a2a4b4fbbe6fc1ef6b85e","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    target \u003d oslo_messaging.Target(version\u003d\u00271.0\u0027,"},{"line_number":32,"context_line":"                                   namespace\u003dtrunk_consts.TRUNK_PLUGIN)"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":35,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":36,"context_line":"    def get_trunk_by_port_id(self, context, port_id):"},{"line_number":37,"context_line":"        \"\"\"Return information for the specified trunk with given port_id.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_3deaf00f","line":34,"in_reply_to":"dada55a8_baf9c682","updated":"2016-07-20 00:49:17.000000000","message":"Done","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            LOG.debug(\"No trunk could be found with port_id: %s\", port_id)"},{"line_number":41,"context_line":"        return trunk"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":44,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":45,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_9af4c287","line":43,"updated":"2016-07-20 00:40:15.000000000","message":"do we need filter_fields here? I wouldn\u0027t think so.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3b03e0d157e9cec2bc7a2a4b4fbbe6fc1ef6b85e","unresolved":false,"context_lines":[{"line_number":40,"context_line":"            LOG.debug(\"No trunk could be found with port_id: %s\", port_id)"},{"line_number":41,"context_line":"        return trunk"},{"line_number":42,"context_line":""},{"line_number":43,"context_line":"    @db_base_plugin_common.filter_fields"},{"line_number":44,"context_line":"    @db_base_plugin_common.convert_result_to_dict"},{"line_number":45,"context_line":"    def get_trunk_by_id(self, context, trunk_id):"},{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_7df468f1","line":43,"in_reply_to":"dada55a8_9af4c287","updated":"2016-07-20 00:49:17.000000000","message":"Done","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""},{"line_number":47,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":48,"context_line":"        if not trunk:"},{"line_number":49,"context_line":"            LOG.debug(\"No trunk could be found with id: %s\", trunk_id)"},{"line_number":50,"context_line":"        return trunk"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_1a2f32f7","line":49,"updated":"2016-07-20 00:40:15.000000000","message":"id should be either ID or UUID, but at this point I am not sure what this log is adding, I\u0027d rather simply do\n\nreturn trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)\n\n(and so for line 29).","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"3b03e0d157e9cec2bc7a2a4b4fbbe6fc1ef6b85e","unresolved":false,"context_lines":[{"line_number":46,"context_line":"        \"\"\"Return information for the specified trunk with given id.\"\"\""},{"line_number":47,"context_line":"        trunk \u003d trunk_objects.Trunk.get_object(context, id\u003dtrunk_id)"},{"line_number":48,"context_line":"        if not trunk:"},{"line_number":49,"context_line":"            LOG.debug(\"No trunk could be found with id: %s\", trunk_id)"},{"line_number":50,"context_line":"        return trunk"}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_dd8c7481","line":49,"in_reply_to":"dada55a8_1a2f32f7","updated":"2016-07-20 00:49:17.000000000","message":"will remove logging from here and line 40 as well.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"}],"neutron/tests/unit/services/trunk/rpc/__init__.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"dfa418687191d2b49873b9802665c77995f4be42","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"# under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"__author__ \u003d \u0027Adolfo Duarte\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_d8044719","line":14,"updated":"2016-07-20 23:53:23.000000000","message":"?","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"},{"author":{"_account_id":13770,"name":"Adolfo Duarte","email":"adduarte@redhat.com","username":"adolfoduarte"},"change_message_id":"dbd57bf43b97723b59ca57d63e618dc888cf4d68","unresolved":false,"context_lines":[{"line_number":11,"context_line":"# License for the specific language governing permissions and limitations"},{"line_number":12,"context_line":"# under the License."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"__author__ \u003d \u0027Adolfo Duarte\u0027"}],"source_content_type":"text/x-python","patch_set":15,"id":"dada55a8_517f71df","line":14,"in_reply_to":"dada55a8_d8044719","updated":"2016-07-21 14:25:34.000000000","message":"sorry. this slipped by when creating new file. will delete","commit_id":"38e61a02a82a5dd8c31537e249fa7cdc3641cdd5"}],"neutron/tests/unit/services/trunk/test_rpc_callbacks.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"3e204d8c6ac39c06a977e5baf63cb3e2aab2144c","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.trunk_plugin \u003d trunk_plugin.TrunkPlugin()"},{"line_number":27,"context_line":"        self.trunk_plugin.add_segmentation_type(t_consts.VLAN,"},{"line_number":28,"context_line":"                                                vlan_driver.vlan_range)"},{"line_number":29,"context_line":"        self.callback \u003d trunk_callbacks.TrunkRpcCallback()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def test_get_trunk_by_invalid_port_id(self):"},{"line_number":32,"context_line":"        self.assertIsNone("}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_daf8fa4b","line":29,"updated":"2016-07-20 00:40:15.000000000","message":"Testing the RpcCallback class by pulling in all this plumbing seems a bit more than unit testing, but I can see that in order to test the RPC calls we do need the machinery. I wonder if this would be better tested functionally, by making real RPC calls, as I see quite a duplication with what\u0027s already covered by the other test cases in this module.","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"86f15b97a601252c5f199cf86b4bd0013c3aa03e","unresolved":false,"context_lines":[{"line_number":26,"context_line":"        self.trunk_plugin \u003d trunk_plugin.TrunkPlugin()"},{"line_number":27,"context_line":"        self.trunk_plugin.add_segmentation_type(t_consts.VLAN,"},{"line_number":28,"context_line":"                                                vlan_driver.vlan_range)"},{"line_number":29,"context_line":"        self.callback \u003d trunk_callbacks.TrunkRpcCallback()"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def test_get_trunk_by_invalid_port_id(self):"},{"line_number":32,"context_line":"        self.assertIsNone("}],"source_content_type":"text/x-python","patch_set":13,"id":"dada55a8_4197d147","line":29,"in_reply_to":"dada55a8_daf8fa4b","updated":"2016-07-20 17:51:12.000000000","message":"I keep coming back to the question of functional testing and getting some coverage on actual invocation of the RPC. Is this possible without an agent? I think it would be awesome to have some sort scaffolding to exercise RPC calls without having both server and agent. Maybe this exists?","commit_id":"251b97b022ca1cf1a76397a3e84b11c9a05f52a9"}]}
