)]}'
{"manila/network/neutron/api.py":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"ad527f748b3d947f1b8b7dbea90f1abb858c6ff9","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                port_req_body[\u0027port\u0027][\u0027security_groups\u0027] \u003d security_group_ids"},{"line_number":175,"context_line":"            if mac_address:"},{"line_number":176,"context_line":"                port_req_body[\u0027port\u0027][\u0027mac_address\u0027] \u003d mac_address"},{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please active the extension accordingly.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_6ce0d8cd","line":178,"range":{"start_line":177,"start_character":12,"end_line":178,"end_character":58},"updated":"2016-07-21 14:36:35.000000000","message":"It could be combined to one single condition.","commit_id":"5111f17de8d292dd51828c8de183cc41e9635698"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"b895dfcda30eccd1588fbc3e2527bf27cf76c099","unresolved":false,"context_lines":[{"line_number":174,"context_line":"                port_req_body[\u0027port\u0027][\u0027security_groups\u0027] \u003d security_group_ids"},{"line_number":175,"context_line":"            if mac_address:"},{"line_number":176,"context_line":"                port_req_body[\u0027port\u0027][\u0027mac_address\u0027] \u003d mac_address"},{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please active the extension accordingly.\")"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_af0e6f38","line":178,"range":{"start_line":177,"start_character":12,"end_line":178,"end_character":58},"in_reply_to":"dada55a8_6ce0d8cd","updated":"2016-08-01 06:35:26.000000000","message":"Yes could but L182 would need an additional if-block. So don\u0027t think that it will be more readable.","commit_id":"5111f17de8d292dd51828c8de183cc41e9635698"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"ad527f748b3d947f1b8b7dbea90f1abb858c6ff9","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please active the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"},{"line_number":184,"context_line":"                port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"}],"source_content_type":"text/x-python","patch_set":1,"id":"dada55a8_ccc8e457","line":181,"range":{"start_line":181,"start_character":41,"end_line":181,"end_character":47},"updated":"2016-07-21 14:36:35.000000000","message":"\"active\" could be either noun or adjective, ut not verb. So, I guess you wanted to say \"activate\" here.","commit_id":"5111f17de8d292dd51828c8de183cc41e9635698"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"b895dfcda30eccd1588fbc3e2527bf27cf76c099","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please active the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"},{"line_number":184,"context_line":"                port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_8f0bab29","line":181,"range":{"start_line":181,"start_character":41,"end_line":181,"end_character":47},"in_reply_to":"bacf61ea_d2157440","updated":"2016-08-01 06:35:26.000000000","message":"Done","commit_id":"5111f17de8d292dd51828c8de183cc41e9635698"},{"author":{"_account_id":6491,"name":"xing-yang","email":"xingyang105@gmail.com","username":"xing-yang"},"change_message_id":"471aabd8e30fa9d145ea10af928a6b5fa2dd9e46","unresolved":false,"context_lines":[{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please active the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"},{"line_number":184,"context_line":"                port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"}],"source_content_type":"text/x-python","patch_set":1,"id":"bacf61ea_d2157440","line":181,"range":{"start_line":181,"start_character":41,"end_line":181,"end_character":47},"in_reply_to":"dada55a8_ccc8e457","updated":"2016-07-29 17:02:52.000000000","message":"+1","commit_id":"5111f17de8d292dd51828c8de183cc41e9635698"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"73b408479983a72fe4365691643f1aac5515fd30","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please activate the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_9647951c","line":180,"range":{"start_line":180,"start_character":32,"end_line":180,"end_character":33},"updated":"2016-09-06 03:50:14.000000000","message":"How about add %(host_id)s in this?","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"c8cc2f9fb763ec3b56406d61f0ba27849ce8fdb1","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please activate the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_024cf86e","line":180,"range":{"start_line":180,"start_character":32,"end_line":180,"end_character":33},"in_reply_to":"9a89bdaa_9647951c","updated":"2016-09-21 08:03:32.000000000","message":"Done","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"130fea1eac024462025c10ce97c16c906315d3ca","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please activate the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"},{"line_number":184,"context_line":"                port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_3717e352","line":181,"range":{"start_line":180,"start_character":71,"end_line":181,"end_character":32},"updated":"2016-09-03 11:22:27.000000000","message":"Need a space between \u0027port\u0027 and \u0027binding\u0027.","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"c8cc2f9fb763ec3b56406d61f0ba27849ce8fdb1","unresolved":false,"context_lines":[{"line_number":177,"context_line":"            if host_id:"},{"line_number":178,"context_line":"                if not self._has_port_binding_extension():"},{"line_number":179,"context_line":"                    raise exception.NetworkException("},{"line_number":180,"context_line":"                        \"host_id specified but neutron doesn\u0027t support port\""},{"line_number":181,"context_line":"                        \"binding. Please activate the extension accordingly.\")"},{"line_number":182,"context_line":"                port_req_body[\u0027port\u0027][\u0027binding:host_id\u0027] \u003d host_id"},{"line_number":183,"context_line":"            if dhcp_opts is not None:"},{"line_number":184,"context_line":"                port_req_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d dhcp_opts"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_2247344c","line":181,"range":{"start_line":180,"start_character":71,"end_line":181,"end_character":32},"in_reply_to":"9a89bdaa_3717e352","updated":"2016-09-21 08:03:32.000000000","message":"Done","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"}],"manila/tests/network/neutron/test_neutron_api.py":[{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"a60416311db80fdaebe33129f9c44880f37c24ab","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        # Verify results"},{"line_number":184,"context_line":"        self.neutron_api._has_port_binding_extension.assert_called_once_with()"},{"line_number":185,"context_line":"        self.assertTrue(neutron_api.LOG.exception.called)"},{"line_number":186,"context_line":"        self.assertTrue(clientv20.Client.called)"},{"line_number":187,"context_line":"        self.assertTrue(self.neutron_api.client.create_port.called)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @mock.patch.object(neutron_api.LOG, \u0027exception\u0027, mock.Mock())"},{"line_number":190,"context_line":"    def test_create_port_exception_status_409(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_f0ff2a32","side":"PARENT","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":67},"updated":"2016-09-05 08:39:25.000000000","message":"why these line removed?","commit_id":"d6637a43b8fc206b90fb628c423b993c7e84f57a"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"c8cc2f9fb763ec3b56406d61f0ba27849ce8fdb1","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"        # Verify results"},{"line_number":184,"context_line":"        self.neutron_api._has_port_binding_extension.assert_called_once_with()"},{"line_number":185,"context_line":"        self.assertTrue(neutron_api.LOG.exception.called)"},{"line_number":186,"context_line":"        self.assertTrue(clientv20.Client.called)"},{"line_number":187,"context_line":"        self.assertTrue(self.neutron_api.client.create_port.called)"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"    @mock.patch.object(neutron_api.LOG, \u0027exception\u0027, mock.Mock())"},{"line_number":190,"context_line":"    def test_create_port_exception_status_409(self):"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_dc4f5bbc","side":"PARENT","line":187,"range":{"start_line":185,"start_character":0,"end_line":187,"end_character":67},"in_reply_to":"9a89bdaa_f0ff2a32","updated":"2016-09-21 08:03:32.000000000","message":"Done","commit_id":"d6637a43b8fc206b90fb628c423b993c7e84f57a"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"73b408479983a72fe4365691643f1aac5515fd30","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    def test_create_port_with_host_id_no_binding_ext(self):"},{"line_number":165,"context_line":"        self.mock_object(self.neutron_api, \u0027_has_port_binding_extension\u0027,"},{"line_number":166,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":167,"context_line":"        port_args \u003d {"},{"line_number":168,"context_line":"            \u0027tenant_id\u0027: \u0027test tenant\u0027,"},{"line_number":169,"context_line":"            \u0027network_id\u0027: \u0027test net\u0027,"},{"line_number":170,"context_line":"            \u0027host_id\u0027: \u0027foohost\u0027}"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        self.assertRaises(exception.NetworkException,"},{"line_number":173,"context_line":"                          self.neutron_api.create_port, **port_args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_96f5d5cc","line":170,"range":{"start_line":167,"start_character":8,"end_line":170,"end_character":33},"updated":"2016-09-06 03:50:14.000000000","message":"http://docs.openstack.org/developer/hacking/#dictionaries-lists","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"c8cc2f9fb763ec3b56406d61f0ba27849ce8fdb1","unresolved":false,"context_lines":[{"line_number":164,"context_line":"    def test_create_port_with_host_id_no_binding_ext(self):"},{"line_number":165,"context_line":"        self.mock_object(self.neutron_api, \u0027_has_port_binding_extension\u0027,"},{"line_number":166,"context_line":"                         mock.Mock(return_value\u003dFalse))"},{"line_number":167,"context_line":"        port_args \u003d {"},{"line_number":168,"context_line":"            \u0027tenant_id\u0027: \u0027test tenant\u0027,"},{"line_number":169,"context_line":"            \u0027network_id\u0027: \u0027test net\u0027,"},{"line_number":170,"context_line":"            \u0027host_id\u0027: \u0027foohost\u0027}"},{"line_number":171,"context_line":""},{"line_number":172,"context_line":"        self.assertRaises(exception.NetworkException,"},{"line_number":173,"context_line":"                          self.neutron_api.create_port, **port_args)"}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_bc544f54","line":170,"range":{"start_line":167,"start_character":8,"end_line":170,"end_character":33},"in_reply_to":"9a89bdaa_96f5d5cc","updated":"2016-09-21 08:03:32.000000000","message":"Done","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":16203,"name":"zengyingzhe","email":"zengyingzhe@huawei.com","username":"zengyingzhe"},"change_message_id":"a60416311db80fdaebe33129f9c44880f37c24ab","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    @mock.patch.object(neutron_api.LOG, \u0027exception\u0027, mock.Mock())"},{"line_number":176,"context_line":"    def test_create_port_exception(self):"},{"line_number":177,"context_line":"        # Set up test data"},{"line_number":178,"context_line":"        self.mock_object("},{"line_number":179,"context_line":"            self.neutron_api, \u0027_has_port_binding_extension\u0027,"},{"line_number":180,"context_line":"            mock.Mock(return_value\u003dTrue))"},{"line_number":181,"context_line":"        self.mock_object("}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_5060d635","line":178,"updated":"2016-09-05 08:39:25.000000000","message":"here could be removed as well, cause host_id is not specified in this test, _has_port_binding_extension won\u0027t be called.","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":7872,"name":"Marc Koderer","email":"marc@koderer.com","username":"mkoderer"},"change_message_id":"c8cc2f9fb763ec3b56406d61f0ba27849ce8fdb1","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    @mock.patch.object(neutron_api.LOG, \u0027exception\u0027, mock.Mock())"},{"line_number":176,"context_line":"    def test_create_port_exception(self):"},{"line_number":177,"context_line":"        # Set up test data"},{"line_number":178,"context_line":"        self.mock_object("},{"line_number":179,"context_line":"            self.neutron_api, \u0027_has_port_binding_extension\u0027,"},{"line_number":180,"context_line":"            mock.Mock(return_value\u003dTrue))"},{"line_number":181,"context_line":"        self.mock_object("}],"source_content_type":"text/x-python","patch_set":2,"id":"7a8ec9b2_3c603f35","line":178,"in_reply_to":"9a89bdaa_36ffa968","updated":"2016-09-21 08:03:32.000000000","message":"Done","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"},{"author":{"_account_id":15100,"name":"zhongjun","email":"jun.zhongjun2@gmail.com","username":"zhongjun2"},"change_message_id":"73b408479983a72fe4365691643f1aac5515fd30","unresolved":false,"context_lines":[{"line_number":175,"context_line":"    @mock.patch.object(neutron_api.LOG, \u0027exception\u0027, mock.Mock())"},{"line_number":176,"context_line":"    def test_create_port_exception(self):"},{"line_number":177,"context_line":"        # Set up test data"},{"line_number":178,"context_line":"        self.mock_object("},{"line_number":179,"context_line":"            self.neutron_api, \u0027_has_port_binding_extension\u0027,"},{"line_number":180,"context_line":"            mock.Mock(return_value\u003dTrue))"},{"line_number":181,"context_line":"        self.mock_object("}],"source_content_type":"text/x-python","patch_set":2,"id":"9a89bdaa_36ffa968","line":178,"in_reply_to":"9a89bdaa_5060d635","updated":"2016-09-06 03:50:14.000000000","message":"+1","commit_id":"9e3eee214d411a9bb263278f738bb94246562cff"}],"releasenotes/notes/bug-1602525-port_binding_mandatory-2aaba0fa72b82676.yaml":[{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4d7e191280da5b221bfcae8f1ce2109b1d523cee","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Raises an exception in case the host_id is specified but neutron"},{"line_number":4,"context_line":"    doesn\u0027t support port_binding."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7a8ec9b2_2b061ece","line":3,"range":{"start_line":3,"start_character":47,"end_line":3,"end_character":56},"updated":"2016-09-21 12:29:18.000000000","message":"Where?","commit_id":"d960153f5e7e07923c67ce937fe8f5d4fcf12d98"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"4d7e191280da5b221bfcae8f1ce2109b1d523cee","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Raises an exception in case the host_id is specified but neutron"},{"line_number":4,"context_line":"    doesn\u0027t support port_binding."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7a8ec9b2_8b5ad2f0","line":3,"updated":"2016-09-21 12:29:18.000000000","message":"Who raises?","commit_id":"d960153f5e7e07923c67ce937fe8f5d4fcf12d98"},{"author":{"_account_id":8851,"name":"Valeriy Ponomaryov","email":"kiparis.kh@gmail.com","username":"vponomaryov"},"change_message_id":"dd42181ca5d558abf9def14bcee99b8f9ec1a15f","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Raises an exception in case the host_id is specified but neutron"},{"line_number":4,"context_line":"    doesn\u0027t support port_binding."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7a8ec9b2_6bdae64c","line":3,"in_reply_to":"7a8ec9b2_8b5ad2f0","updated":"2016-09-21 12:29:48.000000000","message":"Just imagine one reads releasenotes, what will he understand here?","commit_id":"d960153f5e7e07923c67ce937fe8f5d4fcf12d98"},{"author":{"_account_id":9003,"name":"Tom Barron","email":"tpb@dyncloud.net","username":"tbarron"},"change_message_id":"6bcb3add7b4083d4e97b6c97fc251379cc59e2f5","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"fixes:"},{"line_number":3,"context_line":"  - Raises an exception in case the host_id is specified but neutron"},{"line_number":4,"context_line":"    doesn\u0027t support port_binding."}],"source_content_type":"text/x-yaml","patch_set":5,"id":"7a8ec9b2_2b89be26","line":4,"range":{"start_line":3,"start_character":4,"end_line":4,"end_character":33},"updated":"2016-09-21 12:31:29.000000000","message":"This doesn\u0027t give any context for \u0027in case the host_id is specified\u0027 and will therefore be quite confusing to the end user reading the reno without looking at the bug fix.\n\nSuggest:\n\n -  Raises an exception in case the host_id is specified when creating a neutron port but the port_binding extension is not activated.","commit_id":"d960153f5e7e07923c67ce937fe8f5d4fcf12d98"}]}
