)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41db2fb092c18ec86ef66e92b12bf72419fabbb2","unresolved":false,"context_lines":[{"line_number":5,"context_line":"CommitDate: 2018-01-29 23:56:28 +0000"},{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Use revision_number on adding/removing security group"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Change-Id: I0651417d18ee54e5c8b5b7292c27159b45e9acf3"},{"line_number":10,"context_line":"Closes-Bug: #1417975"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"bf659307_6ab0bc8c","line":8,"updated":"2018-04-06 12:43:36.000000000","message":"This commit message is really sparse, can you explain what problem this is solving?","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"}],"nova/network/security_group/neutron_driver.py":[{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41db2fb092c18ec86ef66e92b12bf72419fabbb2","unresolved":false,"context_lines":[{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"},{"line_number":486,"context_line":"            neutron.update_port(port[\u0027id\u0027], {\u0027port\u0027: updated_port},"},{"line_number":487,"context_line":"                                revision_number\u003dport[\u0027revision_number\u0027])"},{"line_number":488,"context_line":"            return True"},{"line_number":489,"context_line":"        except n_exc.NeutronClientException as e:"},{"line_number":490,"context_line":"            exc_info \u003d sys.exc_info()"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_8a5bd052","line":487,"range":{"start_line":487,"start_character":32,"end_line":487,"end_character":71},"updated":"2018-04-06 12:43:36.000000000","message":"Can you add a comment about how this is used? Looks like there is some history in the bugs about changes to neutronclient for the If-Match header that this is used for?","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"21ba2a10fbd383ede9cdaea4e5e2d21ef04e9dd4","unresolved":false,"context_lines":[{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"},{"line_number":486,"context_line":"            neutron.update_port(port[\u0027id\u0027], {\u0027port\u0027: updated_port},"},{"line_number":487,"context_line":"                                revision_number\u003dport[\u0027revision_number\u0027])"},{"line_number":488,"context_line":"            return True"},{"line_number":489,"context_line":"        except n_exc.NeutronClientException as e:"},{"line_number":490,"context_line":"            exc_info \u003d sys.exc_info()"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_5f3a5acd","line":487,"range":{"start_line":487,"start_character":32,"end_line":487,"end_character":71},"in_reply_to":"bf659307_8a5bd052","updated":"2018-04-27 22:09:56.000000000","message":"Done","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41db2fb092c18ec86ef66e92b12bf72419fabbb2","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    six.text_type(e))"},{"line_number":494,"context_line":"            elif e.status_code \u003d\u003d 412:"},{"line_number":495,"context_line":"                LOG.info(\u0027Port update precondition failed for \u0027"},{"line_number":496,"context_line":"                         \u0027%(port_id)s with revision_number number \u0027"},{"line_number":497,"context_line":"                         \u0027%(revision_number)s\u0027,"},{"line_number":498,"context_line":"                         {\u0027port_id\u0027: port[\u0027id\u0027],"},{"line_number":499,"context_line":"                          \u0027revision_number\u0027: port[\u0027revision_number\u0027]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_2a588454","line":496,"range":{"start_line":496,"start_character":59,"end_line":496,"end_character":65},"updated":"2018-04-06 12:43:36.000000000","message":"s/number//","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"21ba2a10fbd383ede9cdaea4e5e2d21ef04e9dd4","unresolved":false,"context_lines":[{"line_number":493,"context_line":"                    six.text_type(e))"},{"line_number":494,"context_line":"            elif e.status_code \u003d\u003d 412:"},{"line_number":495,"context_line":"                LOG.info(\u0027Port update precondition failed for \u0027"},{"line_number":496,"context_line":"                         \u0027%(port_id)s with revision_number number \u0027"},{"line_number":497,"context_line":"                         \u0027%(revision_number)s\u0027,"},{"line_number":498,"context_line":"                         {\u0027port_id\u0027: port[\u0027id\u0027],"},{"line_number":499,"context_line":"                          \u0027revision_number\u0027: port[\u0027revision_number\u0027]})"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_7f371ee5","line":496,"range":{"start_line":496,"start_character":59,"end_line":496,"end_character":65},"in_reply_to":"bf659307_2a588454","updated":"2018-04-27 22:09:56.000000000","message":"Done","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":6873,"name":"Matt Riedemann","email":"mriedem.os@gmail.com","username":"mriedem"},"change_message_id":"41db2fb092c18ec86ef66e92b12bf72419fabbb2","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                    \u0027instance\u0027: instance.uuid})"},{"line_number":550,"context_line":"            self.raise_not_found(msg)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def _remove_security_group_to_port(self, port, security_group_id, neutron):"},{"line_number":553,"context_line":"        for attempt in (1, 2, 3):"},{"line_number":554,"context_line":"            port.get(\u0027security_groups\u0027, []).remove(security_group_id)"},{"line_number":555,"context_line":"            updated_port \u003d {\u0027security_groups\u0027: port[\u0027security_groups\u0027]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"bf659307_ea4a8c81","line":552,"range":{"start_line":552,"start_character":31,"end_line":552,"end_character":33},"updated":"2018-04-06 12:43:36.000000000","message":"from","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"21ba2a10fbd383ede9cdaea4e5e2d21ef04e9dd4","unresolved":false,"context_lines":[{"line_number":549,"context_line":"                    \u0027instance\u0027: instance.uuid})"},{"line_number":550,"context_line":"            self.raise_not_found(msg)"},{"line_number":551,"context_line":""},{"line_number":552,"context_line":"    def _remove_security_group_to_port(self, port, security_group_id, neutron):"},{"line_number":553,"context_line":"        for attempt in (1, 2, 3):"},{"line_number":554,"context_line":"            port.get(\u0027security_groups\u0027, []).remove(security_group_id)"},{"line_number":555,"context_line":"            updated_port \u003d {\u0027security_groups\u0027: port[\u0027security_groups\u0027]}"}],"source_content_type":"text/x-python","patch_set":3,"id":"9f6a8fd7_1f34e2dd","line":552,"range":{"start_line":552,"start_character":31,"end_line":552,"end_character":33},"in_reply_to":"bf659307_ea4a8c81","updated":"2018-04-27 22:09:56.000000000","message":"Done","commit_id":"953d5ca9653c3278a504b98470927d036244fbb5"},{"author":{"_account_id":6062,"name":"jichenjc","email":"jichenjc@cn.ibm.com","username":"jichenjc"},"change_message_id":"8901a89ac24d20eb9b72b8a16b32b24d7bbe428a","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                port[\u0027security_groups\u0027] \u003d []"},{"line_number":472,"context_line":"            port[\u0027security_groups\u0027].append(security_group_id)"},{"line_number":473,"context_line":"            updated_port \u003d {\u0027security_groups\u0027: port[\u0027security_groups\u0027]}"},{"line_number":474,"context_line":"            LOG.info(\"Attempting to add security group %(security_group_id)s \""},{"line_number":475,"context_line":"                     \"to port %(port_id)s\","},{"line_number":476,"context_line":"                     {\u0027security_group_id\u0027: security_group_id,"},{"line_number":477,"context_line":"                      \u0027port_id\u0027: port[\u0027id\u0027]})"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_b0440576","line":475,"range":{"start_line":474,"start_character":20,"end_line":475,"end_character":43},"updated":"2018-04-28 06:20:19.000000000","message":"maybe add attempt here for more helpful info in log","commit_id":"b142fed87d403af195c6ceef760cd27de33f4a02"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"21ff0375a2ea3518ee52f8360a56feb98d74b318","unresolved":false,"context_lines":[{"line_number":471,"context_line":"                port[\u0027security_groups\u0027] \u003d []"},{"line_number":472,"context_line":"            port[\u0027security_groups\u0027].append(security_group_id)"},{"line_number":473,"context_line":"            updated_port \u003d {\u0027security_groups\u0027: port[\u0027security_groups\u0027]}"},{"line_number":474,"context_line":"            LOG.info(\"Attempting to add security group %(security_group_id)s \""},{"line_number":475,"context_line":"                     \"to port %(port_id)s\","},{"line_number":476,"context_line":"                     {\u0027security_group_id\u0027: security_group_id,"},{"line_number":477,"context_line":"                      \u0027port_id\u0027: port[\u0027id\u0027]})"},{"line_number":478,"context_line":""}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_ab20189d","line":475,"range":{"start_line":474,"start_character":20,"end_line":475,"end_character":43},"in_reply_to":"9f6a8fd7_b0440576","updated":"2018-04-28 06:53:24.000000000","message":"I think it is OK, we may not care on which attempt it succed, maybe we should just raise a proper exception to users on failure attempts.","commit_id":"b142fed87d403af195c6ceef760cd27de33f4a02"},{"author":{"_account_id":15888,"name":"Zhenyu Zheng","email":"zheng.zhenyu@outlook.com","username":"Kevin_Zheng"},"change_message_id":"21ff0375a2ea3518ee52f8360a56feb98d74b318","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            if self._update_port_attempt(port, updated_port, neutron):"},{"line_number":480,"context_line":"                return True"},{"line_number":481,"context_line":"            port \u003d neutron.show_port(port[\u0027id\u0027]).get(\u0027port\u0027)"},{"line_number":482,"context_line":"        raise exception.SecurityGroupCannotBeApplied()"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"9f6a8fd7_2b1ba873","line":482,"range":{"start_line":482,"start_character":7,"end_line":482,"end_character":54},"updated":"2018-04-28 06:53:24.000000000","message":"It seems to me that the default error message(Network requires port_security_enabled and subnet associated in order to apply security groups.) didn\u0027t reflect what is the true reason here(race for 3 times), maybe we should consider add some custom message here?","commit_id":"b142fed87d403af195c6ceef760cd27de33f4a02"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"2819627d014bcd9f7b7e732dad972f61f3cffee2","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            if self._update_port_attempt(port, updated_port, neutron):"},{"line_number":480,"context_line":"                return True"},{"line_number":481,"context_line":"            port \u003d neutron.show_port(port[\u0027id\u0027]).get(\u0027port\u0027)"},{"line_number":482,"context_line":"        raise exception.SecurityGroupCannotBeApplied()"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":4,"id":"5f7c97a3_f8c12d82","line":482,"range":{"start_line":482,"start_character":7,"end_line":482,"end_character":54},"in_reply_to":"9f6a8fd7_2b1ba873","updated":"2018-05-02 23:11:47.000000000","message":"Done","commit_id":"b142fed87d403af195c6ceef760cd27de33f4a02"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"e0306490f84f8062a560906893d2ddb26f8e8aa1","unresolved":false,"context_lines":[{"line_number":466,"context_line":"            self._add_security_group_to_port(port, security_group_id, neutron)"},{"line_number":467,"context_line":""},{"line_number":468,"context_line":"    def _add_security_group_to_port(self, port, security_group_id, neutron):"},{"line_number":469,"context_line":"        for attempt in (1, 2, 3):"},{"line_number":470,"context_line":"            if \u0027security_groups\u0027 not in port:"},{"line_number":471,"context_line":"                port[\u0027security_groups\u0027] \u003d []"},{"line_number":472,"context_line":"            port[\u0027security_groups\u0027].append(security_group_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_0ebe9ab3","line":469,"updated":"2018-05-25 10:01:39.000000000","message":"Why this particular number of attempts?","commit_id":"486f29df11575c13facb4985550b2ab3a9ba0084"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"e0306490f84f8062a560906893d2ddb26f8e8aa1","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            if self._update_port_attempt(port, updated_port, neutron):"},{"line_number":480,"context_line":"                return True"},{"line_number":481,"context_line":"            port \u003d neutron.show_port(port[\u0027id\u0027]).get(\u0027port\u0027)"},{"line_number":482,"context_line":"        raise exception.MaxAttemptsExceeded(action\u003d\u0027add_security_group\u0027)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_0ed9ba55","line":482,"updated":"2018-05-25 10:01:39.000000000","message":"This exception may change user behavior. I mean a new exception not expected previously. We either need to mention that in reno, or catch it in the code above. What do you think?","commit_id":"486f29df11575c13facb4985550b2ab3a9ba0084"},{"author":{"_account_id":25562,"name":"Chen","email":"dstbtgagt@foxmail.com","username":"chenn2"},"change_message_id":"5ede2866a16a5901d8fe4ad8c6ae3fb855475402","unresolved":false,"context_lines":[{"line_number":479,"context_line":"            if self._update_port_attempt(port, updated_port, neutron):"},{"line_number":480,"context_line":"                return True"},{"line_number":481,"context_line":"            port \u003d neutron.show_port(port[\u0027id\u0027]).get(\u0027port\u0027)"},{"line_number":482,"context_line":"        raise exception.MaxAttemptsExceeded(action\u003d\u0027add_security_group\u0027)"},{"line_number":483,"context_line":""},{"line_number":484,"context_line":"    def _update_port_attempt(self, port, updated_port, neutron):"},{"line_number":485,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_336868f3","line":482,"range":{"start_line":482,"start_character":14,"end_line":482,"end_character":43},"updated":"2018-05-30 14:51:32.000000000","message":"same concerns here. consensus about the number of attempts and the behavior of consequent exception is needed","commit_id":"486f29df11575c13facb4985550b2ab3a9ba0084"},{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"e0306490f84f8062a560906893d2ddb26f8e8aa1","unresolved":false,"context_lines":[{"line_number":487,"context_line":"            # update the port when the HTTP If-Match header matches the"},{"line_number":488,"context_line":"            # revision_number of the said resource."},{"line_number":489,"context_line":"            neutron.update_port(port[\u0027id\u0027], {\u0027port\u0027: updated_port},"},{"line_number":490,"context_line":"                                revision_number\u003dport[\u0027revision_number\u0027])"},{"line_number":491,"context_line":"            return True"},{"line_number":492,"context_line":"        except n_exc.NeutronClientException as e:"},{"line_number":493,"context_line":"            exc_info \u003d sys.exc_info()"}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8ef62ad7","line":490,"updated":"2018-05-25 10:01:39.000000000","message":"Does that revision_number feature requires the particular neutron version?","commit_id":"486f29df11575c13facb4985550b2ab3a9ba0084"}],"nova/tests/unit/network/security_group/test_neutron_driver.py":[{"author":{"_account_id":21813,"name":"Andrey Volkov","email":"m@amadev.ru","username":"avolkov"},"change_message_id":"e0306490f84f8062a560906893d2ddb26f8e8aa1","unresolved":false,"context_lines":[{"line_number":458,"context_line":"        sg_api \u003d neutron_driver.SecurityGroupAPI()"},{"line_number":459,"context_line":"        self.mocked_client.update_port.side_effect \u003d ("},{"line_number":460,"context_line":"            n_exc.NeutronClientException(status_code\u003d412, message\u003d\u0027error\u0027),"},{"line_number":461,"context_line":"            None)"},{"line_number":462,"context_line":"        with mock.patch.object(neutronv20, \u0027find_resourceid_by_name_or_id\u0027,"},{"line_number":463,"context_line":"                               return_value\u003dsg_id):"},{"line_number":464,"context_line":"            sg_api.add_to_instance("}],"source_content_type":"text/x-python","patch_set":5,"id":"5f7c97a3_8e7b8a26","line":461,"updated":"2018-05-25 10:01:39.000000000","message":"Probably need to comment that update_port raises exception on the first call and does okay on the second.","commit_id":"486f29df11575c13facb4985550b2ab3a9ba0084"}]}
