)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67424bd0c3cf3fd2216539a9ce04c350950ae2c1","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thomas Morin \u003ctmmorin.orange@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-16 15:03:39 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OVS: merge the required OpenFloLow version rather than replace"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change modifies the behavior of OVS native and ovs-ofctl bridge"},{"line_number":10,"context_line":"implementations so that instead of configuring the bridge only for the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7a8ec9b2_fd9bee15","line":7,"updated":"2016-09-16 15:23:59.000000000","message":"openflolow? What is that a more efficient version of OF? :)","commit_id":"53fcf2c59ce2f6f3e7f84bae8ecae2d945328909"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"111a03f8bf22af01953624adb97cf8c8576fcb6a","unresolved":false,"context_lines":[{"line_number":4,"context_line":"Commit:     Thomas Morin \u003ctmmorin.orange@gmail.com\u003e"},{"line_number":5,"context_line":"CommitDate: 2016-09-16 15:03:39 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"OVS: merge the required OpenFloLow version rather than replace"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"This change modifies the behavior of OVS native and ovs-ofctl bridge"},{"line_number":10,"context_line":"implementations so that instead of configuring the bridge only for the"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"7a8ec9b2_9b183220","line":7,"in_reply_to":"7a8ec9b2_fd9bee15","updated":"2016-09-16 15:45:52.000000000","message":"I shouldn\u0027t try to fix typos from my phone :)","commit_id":"53fcf2c59ce2f6f3e7f84bae8ecae2d945328909"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"756d330f9b7a40e606fed18735296f516dc95891","unresolved":false,"context_lines":[{"line_number":12,"context_line":"already configured versions."},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"Change-Id: Id5ac7e6431c97fc70d8404b16f89533b6f270eee"},{"line_number":15,"context_line":"Closes-Bug: 1622644"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":6,"id":"7a8ec9b2_612157fc","line":15,"updated":"2016-09-20 17:56:25.000000000","message":"Ok, then this should be revised","commit_id":"1d3e40de972fbfc070c0a3db1e131b41da9b53f3"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"14da3fed0648c8ee9f2def2737817daf43c9da15","unresolved":false,"context_lines":[{"line_number":14,"context_line":"To achieve this, an add_protocols method is added to the OVSBridge"},{"line_number":15,"context_line":"class, relying on the OVSDB add_db_attribute added in"},{"line_number":16,"context_line":"Ib6ce75846f9b13c1c33f0ced5ccc619ee7860dc1, with the behavior of"},{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"7a77a97e_3ba5d803","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":6},"updated":"2016-11-22 13:40:37.000000000","message":"s/makinf/making","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"14da3fed0648c8ee9f2def2737817daf43c9da15","unresolved":false,"context_lines":[{"line_number":14,"context_line":"To achieve this, an add_protocols method is added to the OVSBridge"},{"line_number":15,"context_line":"class, relying on the OVSDB add_db_attribute added in"},{"line_number":16,"context_line":"Ib6ce75846f9b13c1c33f0ced5ccc619ee7860dc1, with the behavior of"},{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"7a77a97e_7b967095","line":17,"range":{"start_line":17,"start_character":36,"end_line":17,"end_character":59},"updated":"2016-11-22 13:40:37.000000000","message":"s/supported, additionally/supported in addition","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"14da3fed0648c8ee9f2def2737817daf43c9da15","unresolved":false,"context_lines":[{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"},{"line_number":21,"context_line":"from I4475865c4f83cb9f3e12c709af752bc490692ca3 ."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"7a77a97e_fb5d20ed","line":20,"range":{"start_line":20,"start_character":18,"end_line":20,"end_character":25},"updated":"2016-11-22 13:40:37.000000000","message":"s/cleaner/a cleaner","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"14da3fed0648c8ee9f2def2737817daf43c9da15","unresolved":false,"context_lines":[{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"},{"line_number":24,"context_line":"hence marked for future removal."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Unit test are modified to that the OVSDB calls at OVSBridge init"},{"line_number":27,"context_line":"are properly mock\u0027d up."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Depends-On: I4386aa293f9b18d2e17b4a80d9c7da4b9b46f3c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":23,"id":"7a77a97e_1b2f3c3f","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":25},"updated":"2016-11-22 13:40:37.000000000","message":"s/Unit test are modified to/Modified unit tests so","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"04dcffc1c3fc46740bbf4b7ca03dc31c0d727f3c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"To achieve this, an add_protocols method is added to the OVSBridge"},{"line_number":15,"context_line":"class, relying on the OVSDB add_db_attribute added in"},{"line_number":16,"context_line":"Ib6ce75846f9b13c1c33f0ced5ccc619ee7860dc1, with the behavior of"},{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"5a74a57a_266df604","line":17,"range":{"start_line":17,"start_character":45,"end_line":17,"end_character":59},"updated":"2016-11-23 09:32:14.000000000","message":"s/, additionally/ in addition","commit_id":"3b48978ae03ceaa167384386177fa0af00390176"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"04dcffc1c3fc46740bbf4b7ca03dc31c0d727f3c","unresolved":false,"context_lines":[{"line_number":14,"context_line":"To achieve this, an add_protocols method is added to the OVSBridge"},{"line_number":15,"context_line":"class, relying on the OVSDB add_db_attribute added in"},{"line_number":16,"context_line":"Ib6ce75846f9b13c1c33f0ced5ccc619ee7860dc1, with the behavior of"},{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"5a74a57a_c690c2ef","line":17,"range":{"start_line":17,"start_character":0,"end_line":17,"end_character":6},"updated":"2016-11-23 09:32:14.000000000","message":"s/makinf/making","commit_id":"3b48978ae03ceaa167384386177fa0af00390176"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"04dcffc1c3fc46740bbf4b7ca03dc31c0d727f3c","unresolved":false,"context_lines":[{"line_number":17,"context_line":"makinf the provided set of versions supported, additionally to already"},{"line_number":18,"context_line":"configured ones."},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"It is aimed to be cleaner solution to bug 1622644 than the quickfix merge"},{"line_number":21,"context_line":"from I4475865c4f83cb9f3e12c709af752bc490692ca3 ."},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"5a74a57a_c67e02ae","line":20,"range":{"start_line":20,"start_character":18,"end_line":20,"end_character":25},"updated":"2016-11-23 09:32:14.000000000","message":"s/cleaner/a cleaner","commit_id":"3b48978ae03ceaa167384386177fa0af00390176"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"04dcffc1c3fc46740bbf4b7ca03dc31c0d727f3c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"},{"line_number":24,"context_line":"hence marked for future removal."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Unit test are modified to that the OVSDB calls at OVSBridge init"},{"line_number":27,"context_line":"are properly mock\u0027d up."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Depends-On: I4386aa293f9b18d2e17b4a80d9c7da4b9b46f3c9"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"5a74a57a_a606661e","line":26,"range":{"start_line":26,"start_character":0,"end_line":26,"end_character":30},"updated":"2016-11-23 09:32:14.000000000","message":"s/Unit test are modified to that/Modified unit tests so","commit_id":"3b48978ae03ceaa167384386177fa0af00390176"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4697ee2296b7633217618bae4dd897d595d6e098","unresolved":false,"context_lines":[{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"},{"line_number":24,"context_line":"hence marked for future removal."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Modified unit tests so that the OVSDB calls at OVSBridge init"},{"line_number":27,"context_line":"are properly mock\u0027d up."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Depends-On: I4386aa293f9b18d2e17b4a80d9c7da4b9b46f3c9"},{"line_number":30,"context_line":"Change-Id: Id5ac7e6431c97fc70d8404b16f89533b6f270eee"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"7a3c09a3_3bf95281","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":23},"updated":"2017-01-16 05:54:51.000000000","message":"it seems many of files are modified only for this part of the change.\ni guess it\u0027s easier to review if you separate it into another patch.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ee298a24d61757f42e5b518f260d259ddb6717d","unresolved":false,"context_lines":[{"line_number":23,"context_line":"After this change, the set_protocols method appears useless and is"},{"line_number":24,"context_line":"hence marked for future removal."},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"Modified unit tests so that the OVSDB calls at OVSBridge init"},{"line_number":27,"context_line":"are properly mock\u0027d up."},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"Depends-On: I4386aa293f9b18d2e17b4a80d9c7da4b9b46f3c9"},{"line_number":30,"context_line":"Change-Id: Id5ac7e6431c97fc70d8404b16f89533b6f270eee"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":34,"id":"7a3c09a3_d8f64cf8","line":27,"range":{"start_line":26,"start_character":0,"end_line":27,"end_character":23},"in_reply_to":"7a3c09a3_3bf95281","updated":"2017-01-17 10:59:36.000000000","message":"Yes, agreed.\n\nYour comment lead me to reanalyse the change, and in fact, the unit test refactoring is not even required (it was required for the  first patch sets), and can easily be moved in a separate change.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"}],"neutron/agent/common/ovs_lib.py":[{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"67424bd0c3cf3fd2216539a9ce04c350950ae2c1","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, protocols,"},{"line_number":202,"context_line":"                              check_error\u003dTrue)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":205,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":206,"context_line":"                                    check_error\u003dTrue)"},{"line_number":207,"context_line":"        if not isinstance(protocols, collections.Iterable):"}],"source_content_type":"text/x-python","patch_set":3,"id":"7a8ec9b2_5d0ea23b","line":204,"updated":"2016-09-16 15:23:59.000000000","message":"Have you considered doing self.set_protocols([ovs_consts.OPENFLOW10, ovs_consts.OPENFLOW13]) everywhere instead of adding a new method?","commit_id":"53fcf2c59ce2f6f3e7f84bae8ecae2d945328909"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ca8ce788981084991c5934b3d5a8fd12e17aa4ca","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, protocols,"},{"line_number":202,"context_line":"                              check_error\u003dTrue)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":205,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":206,"context_line":"                                    check_error\u003dTrue)"},{"line_number":207,"context_line":"        if not isinstance(protocols, collections.Iterable):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_964727bb","line":204,"updated":"2016-09-16 16:45:07.000000000","message":"should we lock here? otherwise two parallel callers may mess the values.","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ba70dc9657637c204736445ab6b3728bf45b86ea","unresolved":false,"context_lines":[{"line_number":201,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, protocols,"},{"line_number":202,"context_line":"                              check_error\u003dTrue)"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":205,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":206,"context_line":"                                    check_error\u003dTrue)"},{"line_number":207,"context_line":"        if not isinstance(protocols, collections.Iterable):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_00663b50","line":204,"in_reply_to":"7a8ec9b2_964727bb","updated":"2016-09-19 07:36:38.000000000","message":"Yes, we can add that.\n\nBut we need to keep in mind that locking here would only prevent parallel run between a given instance of OVSBridge, but nothing currently prevents having multiple instances of OVSBridge for a given OVS bridge.\n\nLooking at the different places that call set_protocols, I wonder if we shouldn\u0027t instead find a way that configuring the bridge be done at init time once of all possible workers.","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ca8ce788981084991c5934b3d5a8fd12e17aa4ca","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":205,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":206,"context_line":"                                    check_error\u003dTrue)"},{"line_number":207,"context_line":"        if not isinstance(protocols, collections.Iterable):"},{"line_number":208,"context_line":"            protocols \u003d [protocols]"},{"line_number":209,"context_line":"        LOG.debug(\"current protocols: %s (%s)\", protocols, type(protocols))"},{"line_number":210,"context_line":"        self.set_protocols(list(set(protocols)| set(added_protocols)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_ccde7e10","line":207,"updated":"2016-09-16 16:45:07.000000000","message":"db_get_val could return string, which is also an iterable.","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ba70dc9657637c204736445ab6b3728bf45b86ea","unresolved":false,"context_lines":[{"line_number":204,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":205,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":206,"context_line":"                                    check_error\u003dTrue)"},{"line_number":207,"context_line":"        if not isinstance(protocols, collections.Iterable):"},{"line_number":208,"context_line":"            protocols \u003d [protocols]"},{"line_number":209,"context_line":"        LOG.debug(\"current protocols: %s (%s)\", protocols, type(protocols))"},{"line_number":210,"context_line":"        self.set_protocols(list(set(protocols)| set(added_protocols)))"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_405cc37c","line":207,"in_reply_to":"7a8ec9b2_ccde7e10","updated":"2016-09-19 07:36:38.000000000","message":"dumb mistake... the whole purpose was do detect strings..","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"ed049383d86921ab870bebfae10a57b1f30d52b0","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        LOG.debug(\"current protocols: %s (%s)\", protocols, type(protocols))"},{"line_number":211,"context_line":"        if isinstance(protocols, six.text_type):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_728887e8","line":208,"updated":"2016-10-11 09:59:11.000000000","message":"I wonder if we could use ovsdb transaction for this get, add, set to avoid any concurrency issue.\n\nlooping in terry wilson here.","commit_id":"1d3e40de972fbfc070c0a3db1e131b41da9b53f3"},{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"00a14b69a6fc005e7838c7350f4ba1939765ab85","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_52b6238b","line":208,"updated":"2016-10-11 10:04:28.000000000","message":"I wonder if we could use ovsdb transaction for this get, add, set to avoid any concurrency issue.\nlooping in terry wilson here.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e292ed1b74ee2f607dac075b614c87ac832c678e","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_ca250fc3","line":208,"in_reply_to":"fa6399be_52b6238b","updated":"2016-10-11 13:45:04.000000000","message":"Unfortunately, there isn\u0027t a way to my knowledge. With the ovs-vsctl interface, you cannot get a value and modify it in the same transaction (you can create a row and modify it, but that doesn\u0027t help us here).\n\nThe native interface mirrors the vsctl interface so it can\u0027t handle it either, even though it technically could. In the ovs master branch, mutate operations have been added to the IDL and exposed via the Python library, but not ovs-vsctl.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"0549958af1c9c8b5087155852d766e9469a59b3e","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_a068f7bb","line":208,"in_reply_to":"fa6399be_65e274d7","updated":"2016-10-11 14:50:26.000000000","message":"Yeah, we could add a new \"DbAddCommand\" to both vsctl/native implementations.The native version, unless we\u0027re wiling to use commits as recent as recent as Aug 15), we\u0027d need to handle the appending ourselves and set the whole value (which is essentially what ovs\u0027s cmd_add does).","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"e3e2d9626ce4a652bbf11a7d142935ff344bb6bd","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_e706811f","line":208,"in_reply_to":"fa6399be_a068f7bb","updated":"2016-10-11 16:57:54.000000000","message":"For fun, I added db_add to the OVSDB api here:\n\nhttps://review.openstack.org/385087\n\nSo this would just turn out to be:\n\n    def add_protocols(self, *protocols):\n        self.ovsdb.db_add(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, *protocols).execute(check_error\u003dTrue)\n\nor similar.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"a9733afbc197cdf00c5e338941c9a7e6adaf4faf","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_65e274d7","line":208,"in_reply_to":"fa6399be_ca250fc3","updated":"2016-10-11 13:55:06.000000000","message":"You have \"ovs-vsctl add ...\" that results, AFAIU, in an OVSDB mutate, and that would to the right thing here.\n\nSo, assuming \u0027mutate/add\u0027 are implemented in neutron.agent.ovsdb ... we could use use them here.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b11e81662de6c32ccf38a42df7029ed50a053ac","unresolved":false,"context_lines":[{"line_number":205,"context_line":"                              check_error\u003dTrue)"},{"line_number":206,"context_line":""},{"line_number":207,"context_line":"    def add_protocols(self, added_protocols):"},{"line_number":208,"context_line":"        protocols \u003d self.db_get_val(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":209,"context_line":"                                    check_error\u003dTrue)"},{"line_number":210,"context_line":"        if isinstance(protocols, six.text_type):"},{"line_number":211,"context_line":"            # this is because db_get_val may return a simple string"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_59355ff5","line":208,"in_reply_to":"fa6399be_e706811f","updated":"2016-11-14 16:57:51.000000000","message":"Excellent!\n\nI rewrote to make use of .db_add.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3f69b5e53afeb50b09f05fead07bef7926509180","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_db_attribute(self, table_name, record, column, value,"},{"line_number":141,"context_line":"                         check_error\u003dFalse, log_errors\u003dTrue):"},{"line_number":142,"context_line":"        self.ovsdb.db_add(table_name, record, (column, value)).execute("},{"line_number":143,"context_line":"            check_error\u003dcheck_error, log_errors\u003dlog_errors)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def clear_db_attribute(self, table_name, record, column):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a77a97e_9a3e14b7","line":142,"range":{"start_line":142,"start_character":8,"end_line":142,"end_character":62},"updated":"2016-11-15 09:20:46.000000000","message":"Looking at https://review.openstack.org/#/c/385087/, why are you passing (column, value) as a set? ovsdb.add requires table, record, column and value.\n\nThis funciton, \"db_add\", has not the same definition as \"db_set\".","commit_id":"1d4d21d7e535b9efea0d882ff1ed035fc7fd4e07"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"91c2114b811462a53a8c26bbc49ec68d8b8c1c06","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_db_attribute(self, table_name, record, column, value,"},{"line_number":141,"context_line":"                         check_error\u003dFalse, log_errors\u003dTrue):"},{"line_number":142,"context_line":"        self.ovsdb.db_add(table_name, record, (column, value)).execute("},{"line_number":143,"context_line":"            check_error\u003dcheck_error, log_errors\u003dlog_errors)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def clear_db_attribute(self, table_name, record, column):"}],"source_content_type":"text/x-python","patch_set":17,"id":"7a77a97e_da6fa990","line":142,"range":{"start_line":142,"start_character":8,"end_line":142,"end_character":62},"in_reply_to":"7a77a97e_9a3e14b7","updated":"2016-11-15 10:25:37.000000000","message":"Done","commit_id":"1d4d21d7e535b9efea0d882ff1ed035fc7fd4e07"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"a5889da74249a70524ff623ecb1de831ff7fe20b","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_db_attribute(self, table_name, record, column, values,"},{"line_number":141,"context_line":"                         check_error\u003dFalse, log_errors\u003dTrue):"},{"line_number":142,"context_line":"        self.ovsdb.db_add(table_name, record, column, *values).execute("},{"line_number":143,"context_line":"            check_error\u003dcheck_error, log_errors\u003dlog_errors)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def clear_db_attribute(self, table_name, record, column):"},{"line_number":146,"context_line":"        self.ovsdb.db_clear(table_name, record, column).execute()"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_973a5fcc","line":143,"range":{"start_line":142,"start_character":8,"end_line":143,"end_character":59},"updated":"2016-11-15 13:56:46.000000000","message":"This seems to be where the tests are failing.","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"96b47cfea3e8de38cf1825af83d1c17da0d67374","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_db_attribute(self, table_name, record, column, values,"},{"line_number":141,"context_line":"                         check_error\u003dFalse, log_errors\u003dTrue):"},{"line_number":142,"context_line":"        self.ovsdb.db_add(table_name, record, column, *values).execute("},{"line_number":143,"context_line":"            check_error\u003dcheck_error, log_errors\u003dlog_errors)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def clear_db_attribute(self, table_name, record, column):"},{"line_number":146,"context_line":"        self.ovsdb.db_clear(table_name, record, column).execute()"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_ce8359cb","line":143,"range":{"start_line":142,"start_character":8,"end_line":143,"end_character":59},"in_reply_to":"7a77a97e_973a5fcc","updated":"2016-11-15 16:41:56.000000000","message":"The problem is add_protocols() is called in OVSBridge.__init__. The bridge isn\u0027t actually created there. You have to run OVSBridge.create().","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"88afe905d0930749df33405388077da2ffa02c28","unresolved":false,"context_lines":[{"line_number":139,"context_line":""},{"line_number":140,"context_line":"    def add_db_attribute(self, table_name, record, column, values,"},{"line_number":141,"context_line":"                         check_error\u003dFalse, log_errors\u003dTrue):"},{"line_number":142,"context_line":"        self.ovsdb.db_add(table_name, record, column, *values).execute("},{"line_number":143,"context_line":"            check_error\u003dcheck_error, log_errors\u003dlog_errors)"},{"line_number":144,"context_line":""},{"line_number":145,"context_line":"    def clear_db_attribute(self, table_name, record, column):"},{"line_number":146,"context_line":"        self.ovsdb.db_clear(table_name, record, column).execute()"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_71c22835","line":143,"range":{"start_line":142,"start_character":8,"end_line":143,"end_character":59},"in_reply_to":"7a77a97e_ce8359cb","updated":"2016-11-15 16:56:23.000000000","message":"Thanks.","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"efac1105760bc15b1969a373842d77bba61eb3e5","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self._default_cookie \u003d generate_random_cookie()"},{"line_number":177,"context_line":"        # ovs-ofctl below defaults to OF10, so let\u0027s ensure that this version"},{"line_number":178,"context_line":"        # is enabled:"},{"line_number":179,"context_line":"        self.add_protocols(constants.OPENFLOW10)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @property"},{"line_number":182,"context_line":"    def default_cookie(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_eeed758c","line":179,"updated":"2016-11-15 16:43:29.000000000","message":"This can\u0027t go here--the bridge isn\u0027t created in openvswitch yet. Instead of using add_protocols, just use db_add in the transaction in create().","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"4af38196aff1bc05d00786e24f5a15627885c0ad","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self._default_cookie \u003d generate_random_cookie()"},{"line_number":177,"context_line":"        # ovs-ofctl below defaults to OF10, so let\u0027s ensure that this version"},{"line_number":178,"context_line":"        # is enabled:"},{"line_number":179,"context_line":"        self.add_protocols(constants.OPENFLOW10)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @property"},{"line_number":182,"context_line":"    def default_cookie(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_7d82f953","line":179,"in_reply_to":"7a77a97e_51c52c3a","updated":"2016-11-15 18:14:08.000000000","message":"Because there is no reason to run two separate transactions--it\u0027s just slower.\n\nI wouldn\u0027t even add the add_db_attribute method if it were me. All of the wrappers we use around single ovsdb calls makes it harder to group them into single transactions in calling code. Both jlibosvar and I have played around with adding recursive transactions to get around that issue. But I still see little use making a method to call a single line of code.","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"0bae1b9320455a85b92dbb78f384f29863a2aa35","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self._default_cookie \u003d generate_random_cookie()"},{"line_number":177,"context_line":"        # ovs-ofctl below defaults to OF10, so let\u0027s ensure that this version"},{"line_number":178,"context_line":"        # is enabled:"},{"line_number":179,"context_line":"        self.add_protocols(constants.OPENFLOW10)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @property"},{"line_number":182,"context_line":"    def default_cookie(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_be21d6fd","line":179,"in_reply_to":"7a77a97e_7d82f953","updated":"2016-11-16 06:16:00.000000000","message":"I applied these suggestions in PS19.","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"88afe905d0930749df33405388077da2ffa02c28","unresolved":false,"context_lines":[{"line_number":176,"context_line":"        self._default_cookie \u003d generate_random_cookie()"},{"line_number":177,"context_line":"        # ovs-ofctl below defaults to OF10, so let\u0027s ensure that this version"},{"line_number":178,"context_line":"        # is enabled:"},{"line_number":179,"context_line":"        self.add_protocols(constants.OPENFLOW10)"},{"line_number":180,"context_line":""},{"line_number":181,"context_line":"    @property"},{"line_number":182,"context_line":"    def default_cookie(self):"}],"source_content_type":"text/x-python","patch_set":18,"id":"7a77a97e_51c52c3a","line":179,"in_reply_to":"7a77a97e_eeed758c","updated":"2016-11-15 16:56:23.000000000","message":"Why not simply call self.add_protocols in create, after the transaction, thus avoiding copy-pasting the add_db_attribute/db_add code.  Setting the version does not have to happen in the transaction right ?","commit_id":"67bfd7da2496579965d8b35a7f002c6a06369e1f"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c95ba26f6c3ce1d6c6cfcfcab2c51ba85864aa57","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def set_standalone_mode(self):"},{"line_number":198,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def set_protocols(self, protocols):"},{"line_number":201,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, protocols,"},{"line_number":202,"context_line":"                              check_error\u003dTrue)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_3cf43986","line":200,"updated":"2016-11-21 06:57:59.000000000","message":"can you please explain in the commit message when one should use set_protocols and when one should use add_protocols. This for me is a little confusing\n\nin addition to this should we consider have a deprecation of this method?","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e995c7981510df0752a8c2481270a62815794ddf","unresolved":false,"context_lines":[{"line_number":197,"context_line":"    def set_standalone_mode(self):"},{"line_number":198,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":"    def set_protocols(self, protocols):"},{"line_number":201,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027, protocols,"},{"line_number":202,"context_line":"                              check_error\u003dTrue)"},{"line_number":203,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_10711ce1","line":200,"in_reply_to":"7a77a97e_3cf43986","updated":"2016-11-21 10:37:07.000000000","message":"set_protocols should only be used to restrict the versions configured to a set of versions; most, if not all, of the time add_protocols will bring the desired behavior or simply make a set of versions supported, additionally to already configured ones.\n\nYour comment on deprecating set_protocols is interesting: indeed the only place left where it is used is in testcases, and even these could be doing a set_db_attribute instead.\n\nI will add the explanation to the commit message, and a deprecation flag for set_protocols, in next PS.","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"c95ba26f6c3ce1d6c6cfcfcab2c51ba85864aa57","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            # ovs-ofctl below defaults to OF10, so let\u0027s ensure that"},{"line_number":214,"context_line":"            # this version is enabled:"},{"line_number":215,"context_line":"            txn.add("},{"line_number":216,"context_line":"                self.ovsdb.db_add(\u0027Bridge\u0027, self.br_name,"},{"line_number":217,"context_line":"                                  \u0027protocols\u0027, constants.OPENFLOW10))"},{"line_number":218,"context_line":"            if secure_mode:"},{"line_number":219,"context_line":"                txn.add(self.ovsdb.set_fail_mode(self.br_name,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_3cc6f949","line":216,"updated":"2016-11-21 06:57:59.000000000","message":"why are you not using the method added above?","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e995c7981510df0752a8c2481270a62815794ddf","unresolved":false,"context_lines":[{"line_number":213,"context_line":"            # ovs-ofctl below defaults to OF10, so let\u0027s ensure that"},{"line_number":214,"context_line":"            # this version is enabled:"},{"line_number":215,"context_line":"            txn.add("},{"line_number":216,"context_line":"                self.ovsdb.db_add(\u0027Bridge\u0027, self.br_name,"},{"line_number":217,"context_line":"                                  \u0027protocols\u0027, constants.OPENFLOW10))"},{"line_number":218,"context_line":"            if secure_mode:"},{"line_number":219,"context_line":"                txn.add(self.ovsdb.set_fail_mode(self.br_name,"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_7057b026","line":216,"in_reply_to":"7a77a97e_3cc6f949","updated":"2016-11-21 10:37:07.000000000","message":"See the discussion with Terry: to avoid doing two transactions.","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"19047bdc7959d3c6ebeee8fdb3053ceaa8a1a769","unresolved":false,"context_lines":[{"line_number":199,"context_line":"    def set_standalone_mode(self):"},{"line_number":200,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":201,"context_line":""},{"line_number":202,"context_line":"    @removals.remove("},{"line_number":203,"context_line":"        message\u003d\"use .add_protocols instead\","},{"line_number":204,"context_line":"        version\u003d\"Ocata\","},{"line_number":205,"context_line":"        removal_version\u003d\"Queens\")"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_7be20e05","line":202,"updated":"2016-11-23 17:30:28.000000000","message":"It seems weird to me to deprecate a method in favor of another one that has a completely different behavior. It\u0027d be like deprecating \u0027\u003d\u0027 for append() in lists.\n\nIf we\u0027re sure that there is no reason to ever use set_protocols(), then I\u0027m fine with deprecating it for removal, but recommending to use add_protocols instead seems off. Really set_db_attribute is what it would be replaced with. If it were me, I\u0027d just start documenting the ovs_lib functions like set_protocols/add_protocols--especially since set_protocols is used in tests.","commit_id":"4e2cc59aff31a808427cde387584f25f431ccf1b"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"331f82d794d8ae41f8d7fd8369e456f989bffaa7","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import uuid"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from debtcollector import removals"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutron_lib import exceptions"},{"line_number":25,"context_line":"from oslo_config import cfg"},{"line_number":26,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_83d3f837","line":23,"updated":"2016-12-13 14:25:36.000000000","message":"why the newline?","commit_id":"918bbf8e488c037e48ac63a6e2bdcc862c8093d3"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"8af488aa40b59cedde5f657ff003dfcce8cc3bf9","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import uuid"},{"line_number":21,"context_line":""},{"line_number":22,"context_line":"from debtcollector import removals"},{"line_number":23,"context_line":""},{"line_number":24,"context_line":"from neutron_lib import exceptions"},{"line_number":25,"context_line":"from oslo_config import cfg"},{"line_number":26,"context_line":"from oslo_log import log as logging"}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_35ab351f","line":23,"in_reply_to":"1a6eadb0_83d3f837","updated":"2016-12-13 15:22:34.000000000","message":"I though we used to separate openstack imports from non-openstack imports, but indeed this is not was is used elsewhere.\n\nWill fix.","commit_id":"918bbf8e488c037e48ac63a6e2bdcc862c8093d3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"331f82d794d8ae41f8d7fd8369e456f989bffaa7","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @removals.remove("},{"line_number":212,"context_line":"        message\u003d(\"consider using add_protocols instead, or if replacing\""},{"line_number":213,"context_line":"                 \" the whole set of supported protocols is the desired\""},{"line_number":214,"context_line":"                 \" behavior, using set_db_attribute\"),"},{"line_number":215,"context_line":"        version\u003d\"Ocata\","}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_23e5c408","line":212,"updated":"2016-12-13 14:25:36.000000000","message":"sorry for the nit picking but why spaces at the beginning of the line","commit_id":"918bbf8e488c037e48ac63a6e2bdcc862c8093d3"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"8af488aa40b59cedde5f657ff003dfcce8cc3bf9","unresolved":false,"context_lines":[{"line_number":209,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":210,"context_line":""},{"line_number":211,"context_line":"    @removals.remove("},{"line_number":212,"context_line":"        message\u003d(\"consider using add_protocols instead, or if replacing\""},{"line_number":213,"context_line":"                 \" the whole set of supported protocols is the desired\""},{"line_number":214,"context_line":"                 \" behavior, using set_db_attribute\"),"},{"line_number":215,"context_line":"        version\u003d\"Ocata\","}],"source_content_type":"text/x-python","patch_set":32,"id":"1a6eadb0_f5e7fd0f","line":212,"in_reply_to":"1a6eadb0_23e5c408","updated":"2016-12-13 15:22:34.000000000","message":"No particular reason.\n\nThere are plenty of places where it is done this way.\nDoes it matter ?","commit_id":"918bbf8e488c037e48ac63a6e2bdcc862c8093d3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c4c74e4c2667eaec031c44f629e73730031db644","unresolved":false,"context_lines":[{"line_number":208,"context_line":"        self._set_bridge_fail_mode(FAILMODE_STANDALONE)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    @removals.remove("},{"line_number":211,"context_line":"        message\u003d(\"consider using add_protocols instead, or if replacing\""},{"line_number":212,"context_line":"                 \" the whole set of supported protocols is the desired\""},{"line_number":213,"context_line":"                 \" behavior, using set_db_attribute\"),"},{"line_number":214,"context_line":"        version\u003d\"Ocata\","}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_9d787dfa","line":211,"updated":"2017-01-10 18:03:21.000000000","message":"Use capital letter at the beginning of the sentence.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c4c74e4c2667eaec031c44f629e73730031db644","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    @removals.remove("},{"line_number":211,"context_line":"        message\u003d(\"consider using add_protocols instead, or if replacing\""},{"line_number":212,"context_line":"                 \" the whole set of supported protocols is the desired\""},{"line_number":213,"context_line":"                 \" behavior, using set_db_attribute\"),"},{"line_number":214,"context_line":"        version\u003d\"Ocata\","},{"line_number":215,"context_line":"        removal_version\u003d\"Queens\")"}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_fd8509cf","line":212,"range":{"start_line":212,"start_character":17,"end_line":212,"end_character":20},"updated":"2017-01-10 18:03:21.000000000","message":"Add the spaces (if possible) at the end of the previous line","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ee298a24d61757f42e5b518f260d259ddb6717d","unresolved":false,"context_lines":[{"line_number":209,"context_line":""},{"line_number":210,"context_line":"    @removals.remove("},{"line_number":211,"context_line":"        message\u003d(\"consider using add_protocols instead, or if replacing\""},{"line_number":212,"context_line":"                 \" the whole set of supported protocols is the desired\""},{"line_number":213,"context_line":"                 \" behavior, using set_db_attribute\"),"},{"line_number":214,"context_line":"        version\u003d\"Ocata\","},{"line_number":215,"context_line":"        removal_version\u003d\"Queens\")"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_efb62089","line":212,"range":{"start_line":212,"start_character":17,"end_line":212,"end_character":20},"in_reply_to":"ba5201f7_fd8509cf","updated":"2017-01-17 10:59:36.000000000","message":"It seems some people want to enforce that.\nI still don\u0027t really get why it is important.\n\nBut I will comply.\n\nOne suggestion though: why not capture this demand into coding-checks.sh ?","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4697ee2296b7633217618bae4dd897d595d6e098","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                          \u0027protocols\u0027, *protocols).execute(check_error\u003dTrue)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def create(self, secure_mode\u003dFalse):"},{"line_number":225,"context_line":"        with self.ovsdb.transaction(check_error\u003dTrue) as txn:"},{"line_number":226,"context_line":"            txn.add("},{"line_number":227,"context_line":"                self.ovsdb.add_br(self.br_name,"},{"line_number":228,"context_line":"                datapath_type\u003dself.datapath_type))"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_fbe7cae1","line":225,"range":{"start_line":225,"start_character":36,"end_line":225,"end_character":52},"updated":"2017-01-16 05:54:51.000000000","message":"is this change related to the rest of patch?","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ee298a24d61757f42e5b518f260d259ddb6717d","unresolved":false,"context_lines":[{"line_number":222,"context_line":"                          \u0027protocols\u0027, *protocols).execute(check_error\u003dTrue)"},{"line_number":223,"context_line":""},{"line_number":224,"context_line":"    def create(self, secure_mode\u003dFalse):"},{"line_number":225,"context_line":"        with self.ovsdb.transaction(check_error\u003dTrue) as txn:"},{"line_number":226,"context_line":"            txn.add("},{"line_number":227,"context_line":"                self.ovsdb.add_br(self.br_name,"},{"line_number":228,"context_line":"                datapath_type\u003dself.datapath_type))"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_4f22d402","line":225,"range":{"start_line":225,"start_character":36,"end_line":225,"end_character":52},"in_reply_to":"7a3c09a3_fbe7cae1","updated":"2017-01-17 10:59:36.000000000","message":"No, indeed it is not.\nWill move away in a separate patch.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4697ee2296b7633217618bae4dd897d595d6e098","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            txn.add("},{"line_number":227,"context_line":"                self.ovsdb.add_br(self.br_name,"},{"line_number":228,"context_line":"                datapath_type\u003dself.datapath_type))"},{"line_number":229,"context_line":"            # ovs-ofctl below defaults to OF10, so let\u0027s ensure that"},{"line_number":230,"context_line":"            # this version is enabled:"},{"line_number":231,"context_line":"            txn.add("},{"line_number":232,"context_line":"                self.ovsdb.db_add(\u0027Bridge\u0027, self.br_name,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_3bd23201","line":229,"range":{"start_line":229,"start_character":14,"end_line":229,"end_character":30},"updated":"2017-01-16 05:54:51.000000000","message":"which ovs-ofctl are you talking about here?\n\ni think it\u0027s actually a preparation for possible add_protocols calls, right?","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ee298a24d61757f42e5b518f260d259ddb6717d","unresolved":false,"context_lines":[{"line_number":226,"context_line":"            txn.add("},{"line_number":227,"context_line":"                self.ovsdb.add_br(self.br_name,"},{"line_number":228,"context_line":"                datapath_type\u003dself.datapath_type))"},{"line_number":229,"context_line":"            # ovs-ofctl below defaults to OF10, so let\u0027s ensure that"},{"line_number":230,"context_line":"            # this version is enabled:"},{"line_number":231,"context_line":"            txn.add("},{"line_number":232,"context_line":"                self.ovsdb.db_add(\u0027Bridge\u0027, self.br_name,"}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_0f87ecd7","line":229,"range":{"start_line":229,"start_character":14,"end_line":229,"end_character":30},"in_reply_to":"7a3c09a3_3bd23201","updated":"2017-01-17 10:59:36.000000000","message":"Setting the protocol to OF10 requires no preparation.\nThis is a preparation to ensure that OF10 is enabled, because OF10 is (implicitly, as default) used by run_ofctl ; run_ofctl would fail if OF10 had been unset (which neutron was doing in some commits).\n\nI will improve the comment.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"}],"neutron/agent/linux/openvswitch_firewall/firewall.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"19047bdc7959d3c6ebeee8fdb3053ceaa8a1a769","unresolved":false,"context_lines":[{"line_number":229,"context_line":""},{"line_number":230,"context_line":"    @staticmethod"},{"line_number":231,"context_line":"    def initialize_bridge(int_br):"},{"line_number":232,"context_line":"        int_br.add_protocols(OVSFirewallDriver.REQUIRED_PROTOCOLS)"},{"line_number":233,"context_line":"        return int_br.deferred(full_ordered\u003dTrue)"},{"line_number":234,"context_line":""},{"line_number":235,"context_line":"    def _drop_all_unmatched_flows(self):"}],"source_content_type":"text/x-python","patch_set":26,"id":"5a74a57a_db2082fa","line":232,"updated":"2016-11-23 17:30:28.000000000","message":"This should be:\n\n int_br.add_protocols(*OVSFirewallDriver.REQUIRED_PROTOCOLS)\n\nsince the list needs to be unpacked.","commit_id":"4e2cc59aff31a808427cde387584f25f431ccf1b"}],"neutron/cmd/sanity/checks.py":[{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"7c3a6f481097d2069f6c411c7ca88818fd0ceb9e","unresolved":false,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    with ovs_lib.OVSBridge(br_name) as br:"},{"line_number":382,"context_line":"        try:"},{"line_number":383,"context_line":"            br.add_protocols(\"OpenFlow%d\" % i for i in range(10, 15))"},{"line_number":384,"context_line":"        except RuntimeError as e:"},{"line_number":385,"context_line":"            LOG.debug(\"Exception while checking ovs conntrack support: %s\", e)"},{"line_number":386,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_f0f8f4e7","line":383,"updated":"2016-11-23 21:02:44.000000000","message":"I didn\u0027t notice this before, but this is passing a generator to add_protocols() and it needs to be unpacked from a list as well.","commit_id":"a6f5cb62f48f14a9ecd23291b1f0e82b71bc5f1d"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"c47ec610ebc05f1dc3c82fda45af078e9d1eb7e4","unresolved":false,"context_lines":[{"line_number":380,"context_line":""},{"line_number":381,"context_line":"    with ovs_lib.OVSBridge(br_name) as br:"},{"line_number":382,"context_line":"        try:"},{"line_number":383,"context_line":"            br.add_protocols(\"OpenFlow%d\" % i for i in range(10, 15))"},{"line_number":384,"context_line":"        except RuntimeError as e:"},{"line_number":385,"context_line":"            LOG.debug(\"Exception while checking ovs conntrack support: %s\", e)"},{"line_number":386,"context_line":"            return False"}],"source_content_type":"text/x-python","patch_set":27,"id":"5a74a57a_7c6908be","line":383,"in_reply_to":"5a74a57a_f0f8f4e7","updated":"2016-11-24 09:04:52.000000000","message":"Fixed.","commit_id":"a6f5cb62f48f14a9ecd23291b1f0e82b71bc5f1d"}],"neutron/plugins/ml2/drivers/openvswitch/agent/openflow/ovs_ofctl/ovs_bridge.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"ca8ce788981084991c5934b3d5a8fd12e17aa4ca","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Common code for bridges used by OVS agent\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setup_controllers(self, conf):"},{"line_number":32,"context_line":"        self.add_protocols([ovs_consts.OPENFLOW10])"},{"line_number":33,"context_line":"        self.del_controller()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def drop_port(self, in_port):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_2ca8c2da","line":32,"updated":"2016-09-16 16:45:07.000000000","message":"That\u0027s cool, but not enough, because the cookie bridge does not inherit from here. We need to add OF10 in the cookie bridge too so that ofctl works on native bridges.","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"ba70dc9657637c204736445ab6b3728bf45b86ea","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Common code for bridges used by OVS agent\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setup_controllers(self, conf):"},{"line_number":32,"context_line":"        self.add_protocols([ovs_consts.OPENFLOW10])"},{"line_number":33,"context_line":"        self.del_controller()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def drop_port(self, in_port):"}],"source_content_type":"text/x-python","patch_set":4,"id":"7a8ec9b2_80d96bf5","line":32,"in_reply_to":"7a8ec9b2_2ca8c2da","updated":"2016-09-19 07:36:38.000000000","message":"Adding that to the OVSCookieBridge is an improvement indeed  and will address the case where extensions use it, but will not address the case where an extension or another piece of code instantiate its own OVSBridge.","commit_id":"12ca8a14785c6592ec69499ecc06d7b2743f8d7a"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"b1b24cc26162f3a1bed9e927dd29536d70714f33","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Common code for bridges used by OVS agent\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setup_controllers(self, conf):"},{"line_number":32,"context_line":"        self.set_protocols([ovs_consts.OPENFLOW10, ovs_consts.OPENFLOW13])"},{"line_number":33,"context_line":"        self.del_controller()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def drop_port(self, in_port):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_d047801b","side":"PARENT","line":32,"updated":"2017-02-02 05:28:56.000000000","message":"i guess at this point it might be safer to keep 1.3.\nhow do you think?","commit_id":"601309d937a731df09202eafb2a81fa89a160b11"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"83774f86b58406520f084c9056868de45040b03d","unresolved":false,"context_lines":[{"line_number":29,"context_line":"    \"\"\"Common code for bridges used by OVS agent\"\"\""},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"    def setup_controllers(self, conf):"},{"line_number":32,"context_line":"        self.set_protocols([ovs_consts.OPENFLOW10, ovs_consts.OPENFLOW13])"},{"line_number":33,"context_line":"        self.del_controller()"},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"    def drop_port(self, in_port):"}],"source_content_type":"text/x-python","patch_set":37,"id":"3a461143_190053aa","side":"PARENT","line":32,"in_reply_to":"3a461143_d047801b","updated":"2017-02-02 08:08:50.000000000","message":"Even if an OVS bridge had been configured for 1.3 and something relies on that, I don\u0027t see how this change would introduce a problem since no code removes this version from the configured versions.","commit_id":"601309d937a731df09202eafb2a81fa89a160b11"}],"neutron/plugins/ml2/drivers/openvswitch/agent/ovs_agent_extension_api.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"ed049383d86921ab870bebfae10a57b1f30d52b0","unresolved":false,"context_lines":[{"line_number":15,"context_line":""},{"line_number":16,"context_line":"from neutron.agent.common import ovs_lib"},{"line_number":17,"context_line":"from neutron.plugins.ml2.drivers.openvswitch.agent.common import constants \\"},{"line_number":18,"context_line":"    as ovs_consts"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":""},{"line_number":21,"context_line":"class OVSCookieBridge(object):"}],"source_content_type":"text/x-python","patch_set":6,"id":"fa6399be_92027b3d","line":18,"updated":"2016-10-11 09:59:11.000000000","message":"It doesn\u0027t seem like you need this anymore.","commit_id":"1d3e40de972fbfc070c0a3db1e131b41da9b53f3"}],"neutron/tests/functional/agent/test_ovs_lib.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"96a7ce8fb9a035c54f537caaf407a9d0cde97436","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_add_protocols(self):"},{"line_number":144,"context_line":"        self.br.set_protocols(\u0027OpenFlow10\u0027)"},{"line_number":145,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":146,"context_line":"        self.assertEqual("},{"line_number":147,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":148,"context_line":"            \"OpenFlow10,OpenFlow13\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_c34ee3c0","line":145,"updated":"2016-10-11 11:12:29.000000000","message":"In the code you pass list of strings. Might be worth to cover that case too.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"464edb4d63e37ef837574a941b4930dad0dc74c7","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_add_protocols(self):"},{"line_number":144,"context_line":"        self.br.set_protocols(\u0027OpenFlow10\u0027)"},{"line_number":145,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":146,"context_line":"        self.assertEqual("},{"line_number":147,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":148,"context_line":"            \"OpenFlow10,OpenFlow13\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_c62a7f2f","line":145,"in_reply_to":"fa6399be_c34ee3c0","updated":"2016-10-17 18:59:45.000000000","message":"This is actually a bug  since \u0027OpenFlow10\u0027 would be converted to the set {\u0027O\u0027, \u0027p\u0027, \u0027e\u0027, \u0027n\u0027, \u0027F\u0027, \u0027l\u0027 \u0027o\u0027, \u0027w\u0027, \u00271\u0027, \u00270\u0027} by add_protocols. I think a much cleaner definition of add_protocols would be:\n\n def add_protocols(self, *protocols):\n\nsince that would keep us from bugs like the above and be less annoying to type for single values.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b11e81662de6c32ccf38a42df7029ed50a053ac","unresolved":false,"context_lines":[{"line_number":142,"context_line":""},{"line_number":143,"context_line":"    def test_add_protocols(self):"},{"line_number":144,"context_line":"        self.br.set_protocols(\u0027OpenFlow10\u0027)"},{"line_number":145,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":146,"context_line":"        self.assertEqual("},{"line_number":147,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":148,"context_line":"            \"OpenFlow10,OpenFlow13\")"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_dc64fde6","line":145,"in_reply_to":"fa6399be_c62a7f2f","updated":"2016-11-14 16:57:51.000000000","message":"Thanks for the nice idea.\nApplied in PS16.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":163,"context_line":"        self.assertEqual("},{"line_number":164,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":165,"context_line":"            \"OpenFlow10,OpenFlow13\")"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12\u0027)"},{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_f2c48560","line":165,"updated":"2016-11-14 17:51:02.000000000","message":"db_get_val will return an array if there is more than one value.","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f2e03589065d6d6286c910063074c10d0332228c","unresolved":false,"context_lines":[{"line_number":162,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":163,"context_line":"        self.assertEqual("},{"line_number":164,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":165,"context_line":"            \"OpenFlow10,OpenFlow13\")"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12\u0027)"},{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77a97e_844b192b","line":165,"in_reply_to":"9a629dbe_f2c48560","updated":"2016-11-15 08:59:22.000000000","message":"Done","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":165,"context_line":"            \"OpenFlow10,OpenFlow13\")"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12\u0027)"},{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":169,"context_line":"        self.assertEqual("},{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_12b579cf","line":167,"updated":"2016-11-14 17:51:02.000000000","message":"set_protocols should be passed an array of protocols, not a comma-separated string. This just happens to work on the vsctl implementation, but won\u0027t work on native.","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f2e03589065d6d6286c910063074c10d0332228c","unresolved":false,"context_lines":[{"line_number":164,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":165,"context_line":"            \"OpenFlow10,OpenFlow13\")"},{"line_number":166,"context_line":""},{"line_number":167,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12\u0027)"},{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":169,"context_line":"        self.assertEqual("},{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77a97e_a448152f","line":167,"in_reply_to":"9a629dbe_12b579cf","updated":"2016-11-15 08:59:22.000000000","message":"Done","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":169,"context_line":"        self.assertEqual("},{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":171,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12,OpenFlow13\u0027)"},{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_52aff17c","line":171,"updated":"2016-11-14 17:51:02.000000000","message":"same","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f2e03589065d6d6286c910063074c10d0332228c","unresolved":false,"context_lines":[{"line_number":168,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":169,"context_line":"        self.assertEqual("},{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":171,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12,OpenFlow13\u0027)"},{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77a97e_c45511c7","line":171,"in_reply_to":"9a629dbe_52aff17c","updated":"2016-11-15 08:59:22.000000000","message":"Done","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":171,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12,OpenFlow13\u0027)"},{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":175,"context_line":"        self.assertEqual("},{"line_number":176,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_92c9895d","line":173,"updated":"2016-11-14 17:51:02.000000000","message":"same","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f2e03589065d6d6286c910063074c10d0332228c","unresolved":false,"context_lines":[{"line_number":170,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":171,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":172,"context_line":""},{"line_number":173,"context_line":"        self.br.set_protocols(\u0027OpenFlow10,OpenFlow12,OpenFlow13\u0027)"},{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":175,"context_line":"        self.assertEqual("},{"line_number":176,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77a97e_e4520ddd","line":173,"in_reply_to":"9a629dbe_92c9895d","updated":"2016-11-15 08:59:22.000000000","message":"Done","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":175,"context_line":"        self.assertEqual("},{"line_number":176,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":177,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def test_get_datapath_id(self):"},{"line_number":180,"context_line":"        brdev \u003d ip_lib.IPDevice(self.br.br_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"9a629dbe_f2c0052d","line":177,"updated":"2016-11-14 17:51:02.000000000","message":"same","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"f2e03589065d6d6286c910063074c10d0332228c","unresolved":false,"context_lines":[{"line_number":174,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":175,"context_line":"        self.assertEqual("},{"line_number":176,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":177,"context_line":"            \"OpenFlow10,OpenFlow12,OpenFlow13\")"},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"    def test_get_datapath_id(self):"},{"line_number":180,"context_line":"        brdev \u003d ip_lib.IPDevice(self.br.br_name)"}],"source_content_type":"text/x-python","patch_set":16,"id":"7a77a97e_045e29e9","line":177,"in_reply_to":"9a629dbe_f2c0052d","updated":"2016-11-15 08:59:22.000000000","message":"Done","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"29fde5c7abb466a2759f7d6da8794e717b6fb073","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":158,"context_line":"            \"OpenFlow10\")"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_add_protocols(self):"},{"line_number":161,"context_line":"        self.br.set_protocols(\u0027OpenFlow10\u0027)"},{"line_number":162,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":163,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_43505b0b","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":33},"updated":"2016-11-18 16:02:24.000000000","message":"nit, I\u0027d break this into 3 different tests.","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e995c7981510df0752a8c2481270a62815794ddf","unresolved":false,"context_lines":[{"line_number":157,"context_line":"            self.br.db_get_val(\u0027Bridge\u0027, self.br.br_name, \u0027protocols\u0027),"},{"line_number":158,"context_line":"            \"OpenFlow10\")"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_add_protocols(self):"},{"line_number":161,"context_line":"        self.br.set_protocols(\u0027OpenFlow10\u0027)"},{"line_number":162,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"},{"line_number":163,"context_line":"        self.assertEqual("}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_f03900f4","line":160,"range":{"start_line":160,"start_character":4,"end_line":160,"end_character":33},"in_reply_to":"7a77a97e_43505b0b","updated":"2016-11-21 10:37:07.000000000","message":"Good point, will do in next PS.","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"5e41bb0324b85cc68b32eba3dfe42db68b24a015","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            \"OpenFlow10\")"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_add_protocols_start_with_one(self):"},{"line_number":161,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":162,"context_line":"                              [\u0027OpenFlow10\u0027],"},{"line_number":163,"context_line":"                              check_error\u003dTrue)"},{"line_number":164,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_ef59d38f","line":161,"range":{"start_line":161,"start_character":8,"end_line":161,"end_character":29},"updated":"2016-11-22 15:28:06.000000000","message":"self.br.set_db_attribute?","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"85487c6c7f8fb61c57f7ca3003edb2202e478b98","unresolved":false,"context_lines":[{"line_number":158,"context_line":"            \"OpenFlow10\")"},{"line_number":159,"context_line":""},{"line_number":160,"context_line":"    def test_add_protocols_start_with_one(self):"},{"line_number":161,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":162,"context_line":"                              [\u0027OpenFlow10\u0027],"},{"line_number":163,"context_line":"                              check_error\u003dTrue)"},{"line_number":164,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_bd49ca90","line":161,"range":{"start_line":161,"start_character":8,"end_line":161,"end_character":29},"in_reply_to":"7a77a97e_ef59d38f","updated":"2016-11-22 20:01:03.000000000","message":"Yes, thanks...","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"5e41bb0324b85cc68b32eba3dfe42db68b24a015","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            [\u0027OpenFlow10\u0027, \u0027OpenFlow13\u0027])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_add_protocols_start_with_two(self):"},{"line_number":170,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":171,"context_line":"                              [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027],"},{"line_number":172,"context_line":"                              check_error\u003dTrue)"},{"line_number":173,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_8f493fba","line":170,"range":{"start_line":170,"start_character":8,"end_line":170,"end_character":29},"updated":"2016-11-22 15:28:06.000000000","message":"ditto","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"85487c6c7f8fb61c57f7ca3003edb2202e478b98","unresolved":false,"context_lines":[{"line_number":167,"context_line":"            [\u0027OpenFlow10\u0027, \u0027OpenFlow13\u0027])"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"    def test_add_protocols_start_with_two(self):"},{"line_number":170,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":171,"context_line":"                              [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027],"},{"line_number":172,"context_line":"                              check_error\u003dTrue)"},{"line_number":173,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_fd43426a","line":170,"range":{"start_line":170,"start_character":8,"end_line":170,"end_character":29},"in_reply_to":"7a77a97e_8f493fba","updated":"2016-11-22 20:01:03.000000000","message":"Done","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"5e41bb0324b85cc68b32eba3dfe42db68b24a015","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027, \u0027OpenFlow13\u0027])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_add_protocols_add_existing(self):"},{"line_number":179,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":180,"context_line":"                              [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027, \u0027OpenFlow13\u0027],"},{"line_number":181,"context_line":"                              check_error\u003dTrue)"},{"line_number":182,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_6fe5c3a6","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":29},"updated":"2016-11-22 15:28:06.000000000","message":"ditto","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"85487c6c7f8fb61c57f7ca3003edb2202e478b98","unresolved":false,"context_lines":[{"line_number":176,"context_line":"            [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027, \u0027OpenFlow13\u0027])"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":"    def test_add_protocols_add_existing(self):"},{"line_number":179,"context_line":"        self.set_db_attribute(\u0027Bridge\u0027, self.br_name, \u0027protocols\u0027,"},{"line_number":180,"context_line":"                              [\u0027OpenFlow10\u0027, \u0027OpenFlow12\u0027, \u0027OpenFlow13\u0027],"},{"line_number":181,"context_line":"                              check_error\u003dTrue)"},{"line_number":182,"context_line":"        self.br.add_protocols(\u0027OpenFlow13\u0027)"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_5d59965a","line":179,"range":{"start_line":179,"start_character":8,"end_line":179,"end_character":29},"in_reply_to":"7a77a97e_6fe5c3a6","updated":"2016-11-22 20:01:03.000000000","message":"Done","commit_id":"53638ccc5cfafb96400e8b8455e74e0ad5966a64"}],"neutron/tests/unit/agent/common/test_ovs_lib.py":[{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"96a7ce8fb9a035c54f537caaf407a9d0cde97436","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027l_ids\",\"ofport\"]}\u0027)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class MockOVSDB(object):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __enter__(self):"},{"line_number":49,"context_line":"        self.patch \u003d mock.patch("},{"line_number":50,"context_line":"            \u0027neutron.agent.common.ovs_lib.OVSBridge.add_protocols\u0027)"},{"line_number":51,"context_line":"        self.patch.start()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":54,"context_line":"        self.patch.stop()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class OFCTLParamListMatcher(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_83b06b8d","line":54,"range":{"start_line":46,"start_character":0,"end_line":54,"end_character":25},"updated":"2016-10-11 11:12:29.000000000","message":"I don\u0027t think it\u0027s worth to wrap it with class. Also the name is very misleading as it mocks add_protocols() method only, not ovsdb.\n\nI suggest to do following:\n\n ADD_PROTOCOL_PATH \u003d (\n     \u0027neutron.agent.common.ovs_lib.OVSBridge.add_protocols\u0027)\n\nreplace MockOVSDB() with\n\n with mock.patch(ADD_PROTOCOL_PATH):\n    create_bridge()","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b11e81662de6c32ccf38a42df7029ed50a053ac","unresolved":false,"context_lines":[{"line_number":43,"context_line":"    \u0027l_ids\",\"ofport\"]}\u0027)"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":""},{"line_number":46,"context_line":"class MockOVSDB(object):"},{"line_number":47,"context_line":""},{"line_number":48,"context_line":"    def __enter__(self):"},{"line_number":49,"context_line":"        self.patch \u003d mock.patch("},{"line_number":50,"context_line":"            \u0027neutron.agent.common.ovs_lib.OVSBridge.add_protocols\u0027)"},{"line_number":51,"context_line":"        self.patch.start()"},{"line_number":52,"context_line":""},{"line_number":53,"context_line":"    def __exit__(self, exc_type, exc_value, traceback):"},{"line_number":54,"context_line":"        self.patch.stop()"},{"line_number":55,"context_line":""},{"line_number":56,"context_line":""},{"line_number":57,"context_line":"class OFCTLParamListMatcher(object):"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_67627eaf","line":54,"range":{"start_line":46,"start_character":0,"end_line":54,"end_character":25},"in_reply_to":"fa6399be_83b06b8d","updated":"2016-11-14 16:57:51.000000000","message":"Done","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"96a7ce8fb9a035c54f537caaf407a9d0cde97436","unresolved":false,"context_lines":[{"line_number":825,"context_line":"        super(TestDeferredOVSBridge, self).setUp()"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":828,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        self.br \u003d mock.Mock()"},{"line_number":831,"context_line":"        self.mocked_do_action_flows \u003d mock.patch.object("}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_034a9b83","line":828,"range":{"start_line":828,"start_character":8,"end_line":828,"end_character":59},"updated":"2016-10-11 11:12:29.000000000","message":"All mocks are stopped implicitly at the class teardown, no need to add a cleanup here.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b11e81662de6c32ccf38a42df7029ed50a053ac","unresolved":false,"context_lines":[{"line_number":825,"context_line":"        super(TestDeferredOVSBridge, self).setUp()"},{"line_number":826,"context_line":""},{"line_number":827,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":828,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":829,"context_line":""},{"line_number":830,"context_line":"        self.br \u003d mock.Mock()"},{"line_number":831,"context_line":"        self.mocked_do_action_flows \u003d mock.patch.object("}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_a7865611","line":828,"range":{"start_line":828,"start_character":8,"end_line":828,"end_character":59},"in_reply_to":"fa6399be_034a9b83","updated":"2016-11-14 16:57:51.000000000","message":"Done","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":5756,"name":"Terry Wilson","email":"twilson@redhat.com","username":"otherwiseguy"},"change_message_id":"41359ee9cf6fdf028dd6d4cf80c6eb85ef5164cb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"9a629dbe_9225090c","updated":"2016-11-14 17:51:02.000000000","message":"We really should just remove anything vsctl_only at this point. Functional tests are the best way to test ovs_lib to make sure behavior matches between the implementations.","commit_id":"30fcc5af034b5115f5dee7c97f4bb43e0c3d46be"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"14da3fed0648c8ee9f2def2737817daf43c9da15","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super(OVS_Lib_Test, self).setUp()"},{"line_number":84,"context_line":"        self.BR_NAME \u003d \"br-int\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.br \u003d ovs_lib.OVSBridge(self.BR_NAME)"},{"line_number":87,"context_line":"        self.execute \u003d mock.patch.object("},{"line_number":88,"context_line":"            utils, \"execute\", spec\u003dutils.execute).start()"}],"source_content_type":"text/x-python","patch_set":23,"id":"7a77a97e_7bce7084","side":"PARENT","line":85,"updated":"2016-11-22 13:40:37.000000000","message":"Was this meant to be removed?","commit_id":"a55aed47b7a37a892b193be039ae05d7ece1b1fb"},{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"62971f968af919d082815c70ce97f7deff3b0a3c","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super(OVS_Lib_Test, self).setUp()"},{"line_number":84,"context_line":"        self.BR_NAME \u003d \"br-int\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.br \u003d ovs_lib.OVSBridge(self.BR_NAME)"},{"line_number":87,"context_line":"        self.execute \u003d mock.patch.object("},{"line_number":88,"context_line":"            utils, \"execute\", spec\u003dutils.execute).start()"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a71b18c_a8177ca1","side":"PARENT","line":85,"updated":"2016-12-12 11:12:14.000000000","message":"was this line meant to be deleted?","commit_id":"08426f9653a485ab441f1fca223fe79ecabab947"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"651b3352873e032f947690ab3779ceac11f1f981","unresolved":false,"context_lines":[{"line_number":82,"context_line":"    def setUp(self):"},{"line_number":83,"context_line":"        super(OVS_Lib_Test, self).setUp()"},{"line_number":84,"context_line":"        self.BR_NAME \u003d \"br-int\""},{"line_number":85,"context_line":""},{"line_number":86,"context_line":"        self.br \u003d ovs_lib.OVSBridge(self.BR_NAME)"},{"line_number":87,"context_line":"        self.execute \u003d mock.patch.object("},{"line_number":88,"context_line":"            utils, \"execute\", spec\u003dutils.execute).start()"}],"source_content_type":"text/x-python","patch_set":31,"id":"3a71b18c_4946e37b","side":"PARENT","line":85,"in_reply_to":"3a71b18c_a8177ca1","updated":"2016-12-12 13:22:28.000000000","message":"Nope, not really. I will revert.","commit_id":"08426f9653a485ab441f1fca223fe79ecabab947"}],"neutron/tests/unit/agent/l2/extensions/test_qos.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"00a14b69a6fc005e7838c7350f4ba1939765ab85","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def setUp(self):"},{"line_number":140,"context_line":"        super(QosExtensionBaseTestCase, self).setUp()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":143,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":144,"context_line":"        self.qos_ext \u003d qos.QosAgentExtension()"},{"line_number":145,"context_line":"        self.context \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_d22f939f","line":142,"updated":"2016-10-11 10:04:28.000000000","message":"I\u0027m looping in Jakub Libosvar here to see if this has a better option (like fixtures?)","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"3b11e81662de6c32ccf38a42df7029ed50a053ac","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def setUp(self):"},{"line_number":140,"context_line":"        super(QosExtensionBaseTestCase, self).setUp()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":143,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":144,"context_line":"        self.qos_ext \u003d qos.QosAgentExtension()"},{"line_number":145,"context_line":"        self.context \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"9a629dbe_0776223e","line":142,"in_reply_to":"fa6399be_3e09782d","updated":"2016-11-14 16:57:51.000000000","message":"Done, and removed original L143 as well.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"},{"author":{"_account_id":8655,"name":"Jakub Libosvar","email":"libosvar@redhat.com","username":"jlibosva"},"change_message_id":"96a7ce8fb9a035c54f537caaf407a9d0cde97436","unresolved":false,"context_lines":[{"line_number":139,"context_line":"    def setUp(self):"},{"line_number":140,"context_line":"        super(QosExtensionBaseTestCase, self).setUp()"},{"line_number":141,"context_line":""},{"line_number":142,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":143,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":144,"context_line":"        self.qos_ext \u003d qos.QosAgentExtension()"},{"line_number":145,"context_line":"        self.context \u003d context.get_admin_context()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_3e09782d","line":142,"in_reply_to":"fa6399be_d22f939f","updated":"2016-10-11 11:12:29.000000000","message":"I think that mock_off is not needed at all. The L143 in original code is redundant - see my comment on previous file. If connection and transactions need to be mocked out, just wrap it with a function and be done with it, cleanup will stop() all mocks implicitly.","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"}],"neutron/tests/unit/agent/linux/test_interface.py":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c4c74e4c2667eaec031c44f629e73730031db644","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.ip_p \u003d mock.patch.object(ip_lib, \u0027IPWrapper\u0027)"},{"line_number":84,"context_line":"        self.ip \u003d self.ip_p.start()"},{"line_number":85,"context_line":"        self.device_exists_p \u003d mock.patch.object(ip_lib, \u0027device_exists\u0027)"},{"line_number":86,"context_line":"        ovsdb_mock.mock_on()"},{"line_number":87,"context_line":"        self.device_exists \u003d self.device_exists_p.start()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"ba5201f7_9d179d53","line":86,"updated":"2017-01-10 18:03:21.000000000","message":"Why are mocking this object, related with OVS, in the TestBase?\n\nYou should mock this only in OVS tests.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"7ee298a24d61757f42e5b518f260d259ddb6717d","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.ip_p \u003d mock.patch.object(ip_lib, \u0027IPWrapper\u0027)"},{"line_number":84,"context_line":"        self.ip \u003d self.ip_p.start()"},{"line_number":85,"context_line":"        self.device_exists_p \u003d mock.patch.object(ip_lib, \u0027device_exists\u0027)"},{"line_number":86,"context_line":"        ovsdb_mock.mock_on()"},{"line_number":87,"context_line":"        self.device_exists \u003d self.device_exists_p.start()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_f8c6a898","line":86,"in_reply_to":"7a3c09a3_1b9d7659","updated":"2017-01-17 10:59:36.000000000","message":"Correct.\n\nThis is moved out of this change now.","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"},{"author":{"_account_id":6854,"name":"YAMAMOTO Takashi","email":"yamamoto@midokura.com","username":"yamamoto"},"change_message_id":"4697ee2296b7633217618bae4dd897d595d6e098","unresolved":false,"context_lines":[{"line_number":83,"context_line":"        self.ip_p \u003d mock.patch.object(ip_lib, \u0027IPWrapper\u0027)"},{"line_number":84,"context_line":"        self.ip \u003d self.ip_p.start()"},{"line_number":85,"context_line":"        self.device_exists_p \u003d mock.patch.object(ip_lib, \u0027device_exists\u0027)"},{"line_number":86,"context_line":"        ovsdb_mock.mock_on()"},{"line_number":87,"context_line":"        self.device_exists \u003d self.device_exists_p.start()"},{"line_number":88,"context_line":""},{"line_number":89,"context_line":""}],"source_content_type":"text/x-python","patch_set":34,"id":"7a3c09a3_1b9d7659","line":86,"in_reply_to":"ba5201f7_9d179d53","updated":"2017-01-16 05:54:51.000000000","message":"+1","commit_id":"fdf6487a691bfcaa0b2bc8ecab0b8c069bcd13c1"}],"neutron/tests/unit/agent/ovsdb/native/mock_helpers.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"29fde5c7abb466a2759f7d6da8794e717b6fb073","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    conn_patcher \u003d mock.patch("},{"line_number":19,"context_line":"        \u0027neutron.agent.ovsdb.native.connection.Connection.start\u0027)"},{"line_number":20,"context_line":"    conn_patcher.start()"},{"line_number":21,"context_line":"#     trans_patcher \u003d mock.patch("},{"line_number":22,"context_line":"#         \u0027neutron.agent.ovsdb.impl_idl.OvsdbIdl.transaction\u0027)"},{"line_number":23,"context_line":"#     trans_patcher.start()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_e3ade7e9","line":23,"range":{"start_line":21,"start_character":0,"end_line":23,"end_character":27},"updated":"2016-11-18 16:02:24.000000000","message":"Should these be removed?","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e995c7981510df0752a8c2481270a62815794ddf","unresolved":false,"context_lines":[{"line_number":18,"context_line":"    conn_patcher \u003d mock.patch("},{"line_number":19,"context_line":"        \u0027neutron.agent.ovsdb.native.connection.Connection.start\u0027)"},{"line_number":20,"context_line":"    conn_patcher.start()"},{"line_number":21,"context_line":"#     trans_patcher \u003d mock.patch("},{"line_number":22,"context_line":"#         \u0027neutron.agent.ovsdb.impl_idl.OvsdbIdl.transaction\u0027)"},{"line_number":23,"context_line":"#     trans_patcher.start()"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_4b0f652e","line":23,"range":{"start_line":21,"start_character":0,"end_line":23,"end_character":27},"in_reply_to":"7a77a97e_e3ade7e9","updated":"2016-11-21 10:37:07.000000000","message":"Yes.","commit_id":"f8b1e34b629a4515fe337fd54e98fc66e89d12f0"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/extension_drivers/test_qos_driver.py":[{"author":{"_account_id":8788,"name":"Miguel Angel Ajo","email":"mangelajo@redhat.com","username":"mangelajo"},"change_message_id":"00a14b69a6fc005e7838c7350f4ba1939765ab85","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":"    def setUp(self):"},{"line_number":35,"context_line":"        super(QosOVSAgentDriverTestCase, self).setUp()"},{"line_number":36,"context_line":"        ovsdb_patches \u003d ovsdb_mock.mock_on()"},{"line_number":37,"context_line":"        self.addCleanup(ovsdb_mock.mock_off, ovsdb_patches)"},{"line_number":38,"context_line":"        self.context \u003d context.get_admin_context()"},{"line_number":39,"context_line":"        self.qos_driver \u003d qos_driver.QosOVSAgentDriver()"}],"source_content_type":"text/x-python","patch_set":15,"id":"fa6399be_05ff0302","line":36,"updated":"2016-10-11 10:04:28.000000000","message":"we\u0027re mofying a lot of OVS tests, can\u0027t this be done in OVSAgentConfigTestBase ?","commit_id":"c4806d0f30e66e23abc62d1964b7eb1b66433252"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/test_br_phys.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"29fde5c7abb466a2759f7d6da8794e717b6fb073","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(OVSPhysicalBridgeTest, self).setUp()"},{"line_number":35,"context_line":"        conn_patcher \u003d mock.patch("},{"line_number":36,"context_line":"            \u0027neutron.agent.ovsdb.native.connection.Connection.start\u0027)"},{"line_number":37,"context_line":"        conn_patcher.start()"},{"line_number":38,"context_line":"        self.addCleanup(conn_patcher.stop)"},{"line_number":39,"context_line":"        self.setup_bridge_mock(\u0027br-phys\u0027, self.br_phys_cls)"},{"line_number":40,"context_line":"        self.stamp \u003d self.br.default_cookie"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_8325135d","side":"PARENT","line":38,"range":{"start_line":35,"start_character":0,"end_line":38,"end_character":42},"updated":"2016-11-18 16:02:24.000000000","message":"Does this no longer need to be mocked?\nYou don\u0027t seem to have linked to mock_helpers in this file or in the classes this one inherits from.","commit_id":"a55aed47b7a37a892b193be039ae05d7ece1b1fb"},{"author":{"_account_id":12021,"name":"Thomas Morin","email":"tmmorin.orange@gmail.com","username":"tmorin"},"change_message_id":"e995c7981510df0752a8c2481270a62815794ddf","unresolved":false,"context_lines":[{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        super(OVSPhysicalBridgeTest, self).setUp()"},{"line_number":35,"context_line":"        conn_patcher \u003d mock.patch("},{"line_number":36,"context_line":"            \u0027neutron.agent.ovsdb.native.connection.Connection.start\u0027)"},{"line_number":37,"context_line":"        conn_patcher.start()"},{"line_number":38,"context_line":"        self.addCleanup(conn_patcher.stop)"},{"line_number":39,"context_line":"        self.setup_bridge_mock(\u0027br-phys\u0027, self.br_phys_cls)"},{"line_number":40,"context_line":"        self.stamp \u003d self.br.default_cookie"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_40957f86","side":"PARENT","line":38,"range":{"start_line":35,"start_character":0,"end_line":38,"end_character":42},"in_reply_to":"7a77a97e_8325135d","updated":"2016-11-21 10:37:07.000000000","message":"OVSAgentTestBase inherits from OVSRyuTestBase, which inherits from OVSAgentTestBase, that has the required mocking, if I\u0027m correct.  I believe there was initially some redundant mocking.","commit_id":"a55aed47b7a37a892b193be039ae05d7ece1b1fb"}],"neutron/tests/unit/plugins/ml2/drivers/openvswitch/agent/openflow/native/test_br_tun.py":[{"author":{"_account_id":18051,"name":"David Shaughnessy","email":"david.shaughnessy@intel.com","username":"davidsha"},"change_message_id":"29fde5c7abb466a2759f7d6da8794e717b6fb073","unresolved":false,"context_lines":[{"line_number":31,"context_line":"    dvr_process_next_table_id \u003d ovs_const.PATCH_LV_TO_TUN"},{"line_number":32,"context_line":""},{"line_number":33,"context_line":"    def setUp(self):"},{"line_number":34,"context_line":"        conn_patcher \u003d mock.patch("},{"line_number":35,"context_line":"            \u0027neutron.agent.ovsdb.native.connection.Connection.start\u0027)"},{"line_number":36,"context_line":"        conn_patcher.start()"},{"line_number":37,"context_line":"        super(OVSTunnelBridgeTest, self).setUp()"},{"line_number":38,"context_line":"        # NOTE(ivasilevskaya) The behaviour of oslotest.base.addCleanup()"},{"line_number":39,"context_line":"        # according to https://review.openstack.org/#/c/119201/4 guarantees"}],"source_content_type":"text/x-python","patch_set":22,"id":"7a77a97e_e3e5e708","side":"PARENT","line":36,"range":{"start_line":34,"start_character":0,"end_line":36,"end_character":28},"updated":"2016-11-18 16:02:24.000000000","message":"ditto","commit_id":"a55aed47b7a37a892b193be039ae05d7ece1b1fb"}]}
