)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"3c4046b27f99683a648fb6a6da5ca44109d37fea","unresolved":false,"context_lines":[{"line_number":10,"context_line":"a new create_port_db routines must be created that operates on an array."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"},{"line_number":13,"context_line":"Implements: blueprint speed-up-neutron-bulk-creation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_1eb56d32","line":13,"updated":"2018-08-22 15:33:08.000000000","message":"fixed","commit_id":"5646656fd8cb68d20b8f2652ebf7db3359fe0197"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"72168e9fe2a1e78e24fe858b32b632b3687313df","unresolved":false,"context_lines":[{"line_number":10,"context_line":"a new create_port_db routines must be created that operates on an array."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"},{"line_number":13,"context_line":"Implements: blueprint speed-up-neutron-bulk-creation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":3,"id":"3f79a3b5_5263eedc","line":13,"range":{"start_line":13,"start_character":0,"end_line":13,"end_character":10},"updated":"2018-08-21 23:02:18.000000000","message":"is it complete or do you mean Partially ?","commit_id":"5646656fd8cb68d20b8f2652ebf7db3359fe0197"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"7fb36c88c4e34d4a52a5e6d86a8b6b30d5850094","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bulk port creation of DB objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"For port creation methods that are truly optimized for bulk operation,"},{"line_number":10,"context_line":"a new create_port_db routines must be created that operates on an array."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"3f79a3b5_9e44f6a1","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":50},"updated":"2018-11-23 21:07:38.000000000","message":"Could you expand this a bit and elaborate what are optimized in the new bulk create operation?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":6,"context_line":""},{"line_number":7,"context_line":"Add bulk port creation of DB objects"},{"line_number":8,"context_line":""},{"line_number":9,"context_line":"For port creation methods that are truly optimized for bulk operation,"},{"line_number":10,"context_line":"a new create_port_db routines must be created that operates on an array."},{"line_number":11,"context_line":""},{"line_number":12,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":18,"id":"3f79a3b5_e1ae942f","line":9,"range":{"start_line":9,"start_character":35,"end_line":9,"end_character":50},"in_reply_to":"3f79a3b5_9e44f6a1","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"dd27dd35b69e14a203afbffaa0ac66e4d6936a94","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implement a new function called create_port_obj_bulk that optimizes"},{"line_number":10,"context_line":"bulk port creation operations by streamlining ensuring network existence"},{"line_number":11,"context_line":"and operates on an array of port data."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"},{"line_number":14,"context_line":"Partially-Implements: blueprint speed-up-neutron-bulk-creation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3f79a3b5_b4bc20d6","line":11,"updated":"2018-11-29 00:02:07.000000000","message":"@Nate,\n\nDo you have some numbers. For example, how much time it takes to create 2000 ports before and after this patch?","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fa6293c06812ed3e406ce838955141123fdbed8e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Implement a new function called create_port_obj_bulk that optimizes"},{"line_number":10,"context_line":"bulk port creation operations by streamlining ensuring network existence"},{"line_number":11,"context_line":"and operates on an array of port data."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ie819c215944514d0bb43c2ce87394825bda41e94"},{"line_number":14,"context_line":"Partially-Implements: blueprint speed-up-neutron-bulk-creation"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":25,"id":"3f79a3b5_aa5d907c","line":11,"in_reply_to":"3f79a3b5_b4bc20d6","updated":"2018-11-29 15:07:09.000000000","message":"Hongbin: I will be able to furnish those numbers not after this change, but after it\u0027s successor that should complete the \"speed-up-neutron-bulk-port-creation\" blueprint, which is https://review.openstack.org/594540","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"}],"neutron/db/db_base_plugin_v2.py":[{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"3c4046b27f99683a648fb6a6da5ca44109d37fea","unresolved":false,"context_lines":[{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1308,"context_line":"                    bulk_port_data[0],"},{"line_number":1309,"context_line":"                    len(bulk_port_data))"},{"line_number":1310,"context_line":""},{"line_number":1311,"context_line":"            result_ports \u003d []"},{"line_number":1312,"context_line":"            for db_port in db_ports:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_7eaca1ec","line":1309,"updated":"2018-08-22 15:33:08.000000000","message":"Given how bulk_port_data is created from ports in lines 1291-1300 it seems problematic to me that ports and bulk_port_data would differ in number of elements.  But I\u0027m happy to make the change.","commit_id":"5646656fd8cb68d20b8f2652ebf7db3359fe0197"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"72168e9fe2a1e78e24fe858b32b632b3687313df","unresolved":false,"context_lines":[{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1308,"context_line":"                    bulk_port_data[0],"},{"line_number":1309,"context_line":"                    len(bulk_port_data))"},{"line_number":1310,"context_line":""},{"line_number":1311,"context_line":"            result_ports \u003d []"},{"line_number":1312,"context_line":"            for db_port in db_ports:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_12e9f618","line":1309,"range":{"start_line":1309,"start_character":24,"end_line":1309,"end_character":38},"updated":"2018-08-21 23:02:18.000000000","message":"or ports ?","commit_id":"5646656fd8cb68d20b8f2652ebf7db3359fe0197"},{"author":{"_account_id":17120,"name":"Manjeet Singh Bhatia","email":"manjeet.s.bhatia@intel.com","username":"manjeets"},"change_message_id":"54d8ab62c38e402da1826f01a00c299c40955d35","unresolved":false,"context_lines":[{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1308,"context_line":"                    bulk_port_data[0],"},{"line_number":1309,"context_line":"                    len(bulk_port_data))"},{"line_number":1310,"context_line":""},{"line_number":1311,"context_line":"            result_ports \u003d []"},{"line_number":1312,"context_line":"            for db_port in db_ports:"}],"source_content_type":"text/x-python","patch_set":3,"id":"3f79a3b5_8219db22","line":1309,"in_reply_to":"3f79a3b5_7eaca1ec","updated":"2018-08-24 21:28:56.000000000","message":"for every port in ports its created, Im okay with both tbh not a big deal","commit_id":"5646656fd8cb68d20b8f2652ebf7db3359fe0197"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"739ac3d1d9243dcc058eab0fc40d24f109ecfa5b","unresolved":false,"context_lines":[{"line_number":1293,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1296,"context_line":"        bulk_port_data \u003d [dict(tenant_id\u003dport[\u0027port\u0027].get(\u0027tenant_id\u0027),"},{"line_number":1297,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1298,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1299,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_84e57ddd","line":1296,"updated":"2018-10-02 00:22:34.000000000","message":"done; this differs from the base pattern at L1339 but it\u0027s the right thing to do.","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"073c9622f66a858849aa1b783cb8e81e742e624a","unresolved":false,"context_lines":[{"line_number":1293,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1294,"context_line":""},{"line_number":1295,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1296,"context_line":"        bulk_port_data \u003d [dict(tenant_id\u003dport[\u0027port\u0027].get(\u0027tenant_id\u0027),"},{"line_number":1297,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1298,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1299,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_b11d1cbf","line":1296,"range":{"start_line":1296,"start_character":31,"end_line":1296,"end_character":40},"updated":"2018-09-09 07:19:56.000000000","message":"why not use project?","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"073c9622f66a858849aa1b783cb8e81e742e624a","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                         device_id\u003dport[\u0027port\u0027].get(\u0027device_id\u0027),"},{"line_number":1303,"context_line":"                         device_owner\u003dport[\u0027port\u0027].get(\u0027device_owner\u0027),"},{"line_number":1304,"context_line":"                         description\u003dport[\u0027port\u0027].get(\u0027description\u0027))"},{"line_number":1305,"context_line":"                     for port in ports]"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        network_id \u003d bulk_port_data[0].get(\u0027network_id\u0027)"},{"line_number":1308,"context_line":"        with db_api.context_manager.writer.using(context):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_1123b006","line":1305,"updated":"2018-09-09 07:19:56.000000000","message":"alignment?","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"739ac3d1d9243dcc058eab0fc40d24f109ecfa5b","unresolved":false,"context_lines":[{"line_number":1302,"context_line":"                         device_id\u003dport[\u0027port\u0027].get(\u0027device_id\u0027),"},{"line_number":1303,"context_line":"                         device_owner\u003dport[\u0027port\u0027].get(\u0027device_owner\u0027),"},{"line_number":1304,"context_line":"                         description\u003dport[\u0027port\u0027].get(\u0027description\u0027))"},{"line_number":1305,"context_line":"                     for port in ports]"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        network_id \u003d bulk_port_data[0].get(\u0027network_id\u0027)"},{"line_number":1308,"context_line":"        with db_api.context_manager.writer.using(context):"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_24cee95a","line":1305,"updated":"2018-10-02 00:22:34.000000000","message":"fixed","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"739ac3d1d9243dcc058eab0fc40d24f109ecfa5b","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"                         description\u003dport[\u0027port\u0027].get(\u0027description\u0027))"},{"line_number":1305,"context_line":"                     for port in ports]"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        network_id \u003d bulk_port_data[0].get(\u0027network_id\u0027)"},{"line_number":1308,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":1309,"context_line":"            # Ensure that the network exists."},{"line_number":1310,"context_line":"            self._get_network(context, network_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_44cbe548","line":1307,"updated":"2018-10-02 00:22:34.000000000","message":"Looking at the syntax of the bulk port create [1], the network_id parameter will be uniform for all ports in the bulk create.\n\nPorts can have multiple subnets attached, but this is not handling that here; this is an attempt to replicate the logic at L1339 optimized for bulk operations, and I don\u0027t see where L1339 handles the subnet.\n\n[1] https://developer.openstack.org/api-ref/network/v2/#bulk-create-ports","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"073c9622f66a858849aa1b783cb8e81e742e624a","unresolved":false,"context_lines":[{"line_number":1304,"context_line":"                         description\u003dport[\u0027port\u0027].get(\u0027description\u0027))"},{"line_number":1305,"context_line":"                     for port in ports]"},{"line_number":1306,"context_line":""},{"line_number":1307,"context_line":"        network_id \u003d bulk_port_data[0].get(\u0027network_id\u0027)"},{"line_number":1308,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":1309,"context_line":"            # Ensure that the network exists."},{"line_number":1310,"context_line":"            self._get_network(context, network_id)"}],"source_content_type":"text/x-python","patch_set":5,"id":"3f79a3b5_7179c4f9","line":1307,"range":{"start_line":1307,"start_character":8,"end_line":1307,"end_character":56},"updated":"2018-09-09 07:19:56.000000000","message":"can ports have different network ids? if so you need to check for each one?","commit_id":"d1a47523a10b924cbd6c3d4df9197e9131c0d6e3"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"db7f664563541f90b36fb7da701bfcc7169ccfa4","unresolved":false,"context_lines":[{"line_number":1328,"context_line":"                    db_port[\u0027ip_allocation\u0027] \u003d (ipalloc_apidef."},{"line_number":1329,"context_line":"                                                IP_ALLOCATION_DEFERRED)"},{"line_number":1330,"context_line":"                result_ports.append(db_port)"},{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"        return result_ports"},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"    def create_port_db(self, context, port):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_f7a4bda6","line":1331,"updated":"2018-10-31 14:20:14.000000000","message":"We still need to make this check [1].\n\n[1] https://github.com/openstack/neutron/blob/eb8759aa980ded1b5ac21b34bd111ef50c17214e/neutron/db/db_base_plugin_v2.py#L1324-L1327","commit_id":"8ac05d1a1b6b9396de696e9fe6d919d2068a8e69"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"6c0d92f973a265d9edf0e26ab6e99b180494ae3b","unresolved":false,"context_lines":[{"line_number":1328,"context_line":"                    db_port[\u0027ip_allocation\u0027] \u003d (ipalloc_apidef."},{"line_number":1329,"context_line":"                                                IP_ALLOCATION_DEFERRED)"},{"line_number":1330,"context_line":"                result_ports.append(db_port)"},{"line_number":1331,"context_line":""},{"line_number":1332,"context_line":"        return result_ports"},{"line_number":1333,"context_line":""},{"line_number":1334,"context_line":"    def create_port_db(self, context, port):"}],"source_content_type":"text/x-python","patch_set":8,"id":"3f79a3b5_9f1a3869","line":1331,"in_reply_to":"3f79a3b5_f7a4bda6","updated":"2018-10-31 20:44:06.000000000","message":"Ah, that means this is lagging behind on it\u0027s version of https://review.openstack.org/584061 which should be the parent change.","commit_id":"8ac05d1a1b6b9396de696e9fe6d919d2068a8e69"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"66f910975d3c005cc8476857bc0b317a7f6cf57e","unresolved":false,"context_lines":[{"line_number":1310,"context_line":"                         description\u003dport[\u0027port\u0027].get(\u0027description\u0027))"},{"line_number":1311,"context_line":"                         for port in ports]"},{"line_number":1312,"context_line":""},{"line_number":1313,"context_line":"        network_id \u003d bulk_port_data[0].get(\u0027network_id\u0027)"},{"line_number":1314,"context_line":"        with db_api.context_manager.writer.using(context):"},{"line_number":1315,"context_line":"            # Ensure that the network exists."},{"line_number":1316,"context_line":"            self._get_network(context, network_id)"}],"source_content_type":"text/x-python","patch_set":10,"id":"3f79a3b5_cef69dd6","line":1313,"updated":"2018-11-02 14:30:41.000000000","message":"Is it really safe to assume all ports on a bulk create will be created on the same network? [1] and [2] seem to indicate there is currently no enforcement of this. This could be a dangerous assumption.\n\n[1] https://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_v2.py#L1267\n\n[2] https://github.com/openstack/neutron/blob/master/neutron/db/db_base_plugin_v2.py#L366","commit_id":"da25c9365c59db3950067420402a7f707459083c"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ea2cfe38f5449761706978e15e16c883df5772bc","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"        db_port \u003d self.create_port_db(context, port)"},{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_5d4c0474","line":1299,"updated":"2018-11-08 20:22:38.000000000","message":"Does this need a @retry decorator like create_port() ?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f042bcce2dc33733817a18e22f155856da59b3bc","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"        db_port \u003d self.create_port_db(context, port)"},{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_7dc1c04e","line":1299,"in_reply_to":"3f79a3b5_5d4c0474","updated":"2018-11-08 20:54:45.000000000","message":"I think it\u0027s a question of where this ends up being invoked from. Is the intent to replace L1267 with an invocation of this method? If so, then the method name could be prefixed with _ and we can rely on the decorator at L1265.","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":1296,"context_line":"        db_port \u003d self.create_port_db(context, port)"},{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_d7c2fe36","line":1299,"in_reply_to":"3f79a3b5_7dc1c04e","updated":"2018-11-12 23:22:48.000000000","message":"The intent is for this to be called from the ML2 plugin like so, and that method has the retry decorator: https://review.openstack.org/#/c/594540/2/neutron/plugins/ml2/plugin.py","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ea2cfe38f5449761706978e15e16c883df5772bc","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1303,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_9d3dbcba","line":1300,"updated":"2018-11-08 20:22:38.000000000","message":"I would do a \u0027p \u003d port[\u0027port\u0027]\u0027 right above this so you can just do p.get(\u0027foo\u0027) in this block","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6ceb610b5208b26da6a5c9175bb8e8beba31ace8","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1303,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_9a46eda8","line":1300,"in_reply_to":"3f79a3b5_5d4ba484","updated":"2018-11-13 01:49:35.000000000","message":"No, it was just a brain fart on my part, I looked right past L1309.","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":1297,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1298,"context_line":""},{"line_number":1299,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1300,"context_line":"        bulk_port_data \u003d [dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1301,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1302,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1303,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_5d4ba484","line":1300,"in_reply_to":"3f79a3b5_9d3dbcba","updated":"2018-11-12 23:22:48.000000000","message":"So you think using a list comprehension is too unwieldy here?  I ask just because doing it that way would mean I would break apart the list comprehension.","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"96d183782386597edc4e3b3cd42f3da993bdd9d8","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"                                                IP_ALLOCATION_DEFERRED)"},{"line_number":1331,"context_line":"                fixed_ips \u003d db_port[\u0027fixed_ips\u0027]"},{"line_number":1332,"context_line":"                if validators.is_attr_set(fixed_ips) and not fixed_ips:"},{"line_number":1333,"context_line":"                    # [] was passed explicitly as fixed_ips."},{"line_number":1334,"context_line":"                    # Thus means this is intended to be an unaddressed port."},{"line_number":1335,"context_line":"                    db_port[\u0027ip_allocation\u0027] \u003d (ipalloc_apidef."},{"line_number":1336,"context_line":"                                                IP_ALLOCATION_NONE)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_3e13ed04","line":1333,"updated":"2018-11-14 16:19:20.000000000","message":"This raises the question of what happens if someone requests a specific fixed IP on one or more ports in a bulk request. It looks like it will be silently ignored (see L1300). I wonder if we should be checking for that and erroring out if fixed_ips is anything but ATTR_NOT_SPECIFIED in the request body. It would be worth having a test of some kind to assert this behavior one way or the other.","commit_id":"fa326e0cc95a057c595284696875e7a5fce57ca6"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"b0cd4045887e7f1dfa20dc3a03d132847dfff092","unresolved":false,"context_lines":[{"line_number":1330,"context_line":"                                                IP_ALLOCATION_DEFERRED)"},{"line_number":1331,"context_line":"                fixed_ips \u003d db_port[\u0027fixed_ips\u0027]"},{"line_number":1332,"context_line":"                if validators.is_attr_set(fixed_ips) and not fixed_ips:"},{"line_number":1333,"context_line":"                    # [] was passed explicitly as fixed_ips."},{"line_number":1334,"context_line":"                    # Thus means this is intended to be an unaddressed port."},{"line_number":1335,"context_line":"                    db_port[\u0027ip_allocation\u0027] \u003d (ipalloc_apidef."},{"line_number":1336,"context_line":"                                                IP_ALLOCATION_NONE)"}],"source_content_type":"text/x-python","patch_set":14,"id":"3f79a3b5_c0765a41","line":1333,"in_reply_to":"3f79a3b5_3e13ed04","updated":"2018-11-19 21:40:25.000000000","message":"Added a check up at L1330, and removed L1333-1337 because that scenario should not be reached.  Added in a custom exception to be thrown in this scenario, and added a test to check for it.","commit_id":"fa326e0cc95a057c595284696875e7a5fce57ca6"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"6f0dfd9b753b3253e1e549022c9dbe1fc93f0042","unresolved":false,"context_lines":[{"line_number":1305,"context_line":"            fixed_ips \u003d port[\u0027port\u0027].get(\u0027fixed_ips\u0027)"},{"line_number":1306,"context_line":"            if fixed_ips is not constants.ATTR_NOT_SPECIFIED:"},{"line_number":1307,"context_line":"                raise ml2_exceptions.BulkPortCannotHaveFixedIpError()"},{"line_number":1308,"context_line":"            bulk_port_data.append(dict(project_id\u003dport[\u0027port\u0027].get(\u0027project_id\u0027),"},{"line_number":1309,"context_line":"                         name\u003dport[\u0027port\u0027].get(\u0027name\u0027),"},{"line_number":1310,"context_line":"                         network_id\u003dport[\u0027port\u0027].get(\u0027network_id\u0027),"},{"line_number":1311,"context_line":"                         admin_state_up\u003dport[\u0027port\u0027].get(\u0027admin_state_up\u0027),"}],"source_content_type":"text/x-python","patch_set":16,"id":"3f79a3b5_4e3b3435","line":1308,"updated":"2018-11-21 17:14:06.000000000","message":"too long","commit_id":"91db0a32938a3928eee0a2c3842e4be42d6e3abf"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c5afd2fe45fd70033b543f73cf7dceeba012cbce","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"    def create_port_bulk(self, context, ports):"},{"line_number":1268,"context_line":"        return self._create_bulk(\u0027port\u0027, context, ports)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def _create_db_port_obj_bulk(self, context, port_data, count\u003d1):"},{"line_number":1271,"context_line":"        db_ports \u003d []"},{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(count)"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_d28105a3","line":1270,"range":{"start_line":1270,"start_character":59,"end_line":1270,"end_character":66},"updated":"2018-11-23 15:18:41.000000000","message":"can\u0027t this be calculated as len(port_data)? What if this will be different value then port_data? If will be lower than it will raise an exception in L1275, right?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"    def create_port_bulk(self, context, ports):"},{"line_number":1268,"context_line":"        return self._create_bulk(\u0027port\u0027, context, ports)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def _create_db_port_obj_bulk(self, context, port_data, count\u003d1):"},{"line_number":1271,"context_line":"        db_ports \u003d []"},{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(count)"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_e13774ad","line":1270,"range":{"start_line":1270,"start_character":59,"end_line":1270,"end_character":66},"in_reply_to":"3f79a3b5_ba6f7bc5","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f7f02b2325ff873d33b03e182aa124cec8ad520e","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"    def create_port_bulk(self, context, ports):"},{"line_number":1268,"context_line":"        return self._create_bulk(\u0027port\u0027, context, ports)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def _create_db_port_obj_bulk(self, context, port_data, count\u003d1):"},{"line_number":1271,"context_line":"        db_ports \u003d []"},{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(count)"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_1e622615","line":1270,"range":{"start_line":1270,"start_character":59,"end_line":1270,"end_character":66},"in_reply_to":"3f79a3b5_d28105a3","updated":"2018-11-23 21:34:16.000000000","message":"+1","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8046b251100787bee9ea45253074e68a091c490c","unresolved":false,"context_lines":[{"line_number":1267,"context_line":"    def create_port_bulk(self, context, ports):"},{"line_number":1268,"context_line":"        return self._create_bulk(\u0027port\u0027, context, ports)"},{"line_number":1269,"context_line":""},{"line_number":1270,"context_line":"    def _create_db_port_obj_bulk(self, context, port_data, count\u003d1):"},{"line_number":1271,"context_line":"        db_ports \u003d []"},{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(count)"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_ba6f7bc5","line":1270,"range":{"start_line":1270,"start_character":59,"end_line":1270,"end_character":66},"in_reply_to":"3f79a3b5_d28105a3","updated":"2018-11-24 07:31:57.000000000","message":"+1","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"7fb36c88c4e34d4a52a5e6d86a8b6b30d5850094","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"                                            mac_address\u003dmac_address,"},{"line_number":1278,"context_line":"                                            id\u003duuidutils.generate_uuid(),"},{"line_number":1279,"context_line":"                                            **port)"},{"line_number":1280,"context_line":"                db_port_obj.create()"},{"line_number":1281,"context_line":"                db_ports.append(db_port_obj)"},{"line_number":1282,"context_line":"        return db_ports"},{"line_number":1283,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_5eb73e89","line":1280,"range":{"start_line":1280,"start_character":16,"end_line":1280,"end_character":36},"updated":"2018-11-23 21:07:38.000000000","message":"Just leave a note. No action is required. I doubt that the bulk creation would still be slow because we are still loading ORM multiple times. To optimize further, how about using the \"Bulk Operations suite of methods\" provided by SQLAlchemy [1]. It should provide a better performance if you really need that.\n\n[1] https://docs.sqlalchemy.org/en/latest/faq/performance.html#i-m-inserting-400-000-rows-with-the-orm-and-it-s-really-slow","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8046b251100787bee9ea45253074e68a091c490c","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"                                            mac_address\u003dmac_address,"},{"line_number":1278,"context_line":"                                            id\u003duuidutils.generate_uuid(),"},{"line_number":1279,"context_line":"                                            **port)"},{"line_number":1280,"context_line":"                db_port_obj.create()"},{"line_number":1281,"context_line":"                db_ports.append(db_port_obj)"},{"line_number":1282,"context_line":"        return db_ports"},{"line_number":1283,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_fa2ad376","line":1280,"range":{"start_line":1280,"start_character":16,"end_line":1280,"end_character":36},"in_reply_to":"3f79a3b5_5eb73e89","updated":"2018-11-24 07:31:57.000000000","message":"This is really a nice improvement for a bulk call with large port num.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1277,"context_line":"                                            mac_address\u003dmac_address,"},{"line_number":1278,"context_line":"                                            id\u003duuidutils.generate_uuid(),"},{"line_number":1279,"context_line":"                                            **port)"},{"line_number":1280,"context_line":"                db_port_obj.create()"},{"line_number":1281,"context_line":"                db_ports.append(db_port_obj)"},{"line_number":1282,"context_line":"        return db_ports"},{"line_number":1283,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_81aa40cd","line":1280,"range":{"start_line":1280,"start_character":16,"end_line":1280,"end_character":36},"in_reply_to":"3f79a3b5_fa2ad376","updated":"2018-11-26 20:13:48.000000000","message":"The bulk operations suite is described as having \"much less functionality, automation, and error checking\" and \"As of SQLAlchemy 1.0, these features should be considered as \u0027beta\u0027\".  I\u0027m not sure I would want to build a neutron feature on a beta-level facility with reduced error checking.\n\nIf you think that is a good course to take, then I would advocate doing so in a follow-on change.  That would allow us to discuss using that facility on it\u0027s own merits separately from the other things in this change.\n\nCitation: https://docs.sqlalchemy.org/en/latest/orm/persistence_techniques.html#bulk-operations in the green box with the dragon.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"7fb36c88c4e34d4a52a5e6d86a8b6b30d5850094","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"        db_port \u003d self.create_port_db(context, port)"},{"line_number":1300,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1303,"context_line":"        bulk_port_data \u003d []"},{"line_number":1304,"context_line":"        for port in ports:"},{"line_number":1305,"context_line":"            fixed_ips \u003d port[\u0027port\u0027].get(\u0027fixed_ips\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_1edf86d3","line":1302,"range":{"start_line":1302,"start_character":8,"end_line":1302,"end_character":28},"updated":"2018-11-23 21:07:38.000000000","message":"It seems this is almost the same as calling self.create_port_db(...) multiple times (except the tweak to batch generate the mac address)? Just wondering what else are optimized in this method?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1299,"context_line":"        db_port \u003d self.create_port_db(context, port)"},{"line_number":1300,"context_line":"        return self._make_port_dict(db_port, process_extensions\u003dFalse)"},{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1303,"context_line":"        bulk_port_data \u003d []"},{"line_number":1304,"context_line":"        for port in ports:"},{"line_number":1305,"context_line":"            fixed_ips \u003d port[\u0027port\u0027].get(\u0027fixed_ips\u0027)"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_21856c0a","line":1302,"range":{"start_line":1302,"start_character":8,"end_line":1302,"end_character":28},"in_reply_to":"3f79a3b5_1edf86d3","updated":"2018-11-26 20:13:48.000000000","message":"The other major optimization is that the step to ensure the network exists only occurs once, instead of once per port.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c5afd2fe45fd70033b543f73cf7dceeba012cbce","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"                     device_owner\u003dpdata.get(\u0027device_owner\u0027),"},{"line_number":1317,"context_line":"                     description\u003dpdata.get(\u0027description\u0027)))"},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        network_ids \u003d {port.get(\u0027network_id\u0027) for port in bulk_port_data}"},{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_3240795e","line":1319,"updated":"2018-11-23 15:18:41.000000000","message":"nit: You can move this to for loop above and do something like:\n\n    network_ids.append(pdata.get(\u0027network_id\u0027))\n\nthen You will not iterate over this list second time here","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8046b251100787bee9ea45253074e68a091c490c","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"                     device_owner\u003dpdata.get(\u0027device_owner\u0027),"},{"line_number":1317,"context_line":"                     description\u003dpdata.get(\u0027description\u0027)))"},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        network_ids \u003d {port.get(\u0027network_id\u0027) for port in bulk_port_data}"},{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_da74b79d","line":1319,"in_reply_to":"3f79a3b5_3240795e","updated":"2018-11-24 07:31:57.000000000","message":"+1","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1316,"context_line":"                     device_owner\u003dpdata.get(\u0027device_owner\u0027),"},{"line_number":1317,"context_line":"                     description\u003dpdata.get(\u0027description\u0027)))"},{"line_number":1318,"context_line":""},{"line_number":1319,"context_line":"        network_ids \u003d {port.get(\u0027network_id\u0027) for port in bulk_port_data}"},{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_a16e5c94","line":1319,"in_reply_to":"3f79a3b5_3240795e","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c5afd2fe45fd70033b543f73cf7dceeba012cbce","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"},{"line_number":1323,"context_line":"                self._get_network(context, network_id)"},{"line_number":1324,"context_line":""},{"line_number":1325,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1326,"context_line":"                    bulk_port_data,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_72183182","line":1323,"updated":"2018-11-23 15:18:41.000000000","message":"or even better maybe, You can move this to L1309 and do this check there directly","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8046b251100787bee9ea45253074e68a091c490c","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"},{"line_number":1323,"context_line":"                self._get_network(context, network_id)"},{"line_number":1324,"context_line":""},{"line_number":1325,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1326,"context_line":"                    bulk_port_data,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_7a6563e3","line":1323,"in_reply_to":"3f79a3b5_72183182","updated":"2018-11-24 07:31:57.000000000","message":"+1","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1320,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1321,"context_line":"            # Ensure that the networks exist."},{"line_number":1322,"context_line":"            for network_id in network_ids:"},{"line_number":1323,"context_line":"                self._get_network(context, network_id)"},{"line_number":1324,"context_line":""},{"line_number":1325,"context_line":"            db_ports \u003d self._create_db_port_obj_bulk(context,"},{"line_number":1326,"context_line":"                    bulk_port_data,"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_a11c1c14","line":1323,"in_reply_to":"3f79a3b5_72183182","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f7f02b2325ff873d33b03e182aa124cec8ad520e","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"                    bulk_port_data,"},{"line_number":1327,"context_line":"                    len(ports))"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"            result_ports \u003d []"},{"line_number":1330,"context_line":"            for db_port in db_ports:"},{"line_number":1331,"context_line":"                try:"},{"line_number":1332,"context_line":"                    self.ipam.allocate_ips_for_port_and_store("}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_7e18fa81","line":1329,"range":{"start_line":1329,"start_character":12,"end_line":1329,"end_character":24},"updated":"2018-11-23 21:34:16.000000000","message":"nit: it seems you don\u0027t need to create this variable since it is the same as \"db_ports\".","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"8046b251100787bee9ea45253074e68a091c490c","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"                    bulk_port_data,"},{"line_number":1327,"context_line":"                    len(ports))"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"            result_ports \u003d []"},{"line_number":1330,"context_line":"            for db_port in db_ports:"},{"line_number":1331,"context_line":"                try:"},{"line_number":1332,"context_line":"                    self.ipam.allocate_ips_for_port_and_store("}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_9a6abfb1","line":1329,"range":{"start_line":1329,"start_character":12,"end_line":1329,"end_character":24},"in_reply_to":"3f79a3b5_7e18fa81","updated":"2018-11-24 07:31:57.000000000","message":"+1","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1326,"context_line":"                    bulk_port_data,"},{"line_number":1327,"context_line":"                    len(ports))"},{"line_number":1328,"context_line":""},{"line_number":1329,"context_line":"            result_ports \u003d []"},{"line_number":1330,"context_line":"            for db_port in db_ports:"},{"line_number":1331,"context_line":"                try:"},{"line_number":1332,"context_line":"                    self.ipam.allocate_ips_for_port_and_store("}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_e1a1b4a8","line":1329,"range":{"start_line":1329,"start_character":12,"end_line":1329,"end_character":24},"in_reply_to":"3f79a3b5_7e18fa81","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f7f02b2325ff873d33b03e182aa124cec8ad520e","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        port_id \u003d p.get(\u0027id\u0027) or uuidutils.generate_uuid()"},{"line_number":1346,"context_line":"        network_id \u003d p[\u0027network_id\u0027]"},{"line_number":1347,"context_line":"        if p.get(\u0027device_owner\u0027):"},{"line_number":1348,"context_line":"            self._enforce_device_owner_not_router_intf_or_device_id("},{"line_number":1349,"context_line":"                context, p.get(\u0027device_owner\u0027), p.get(\u0027device_id\u0027),"},{"line_number":1350,"context_line":"                p[\u0027tenant_id\u0027])"},{"line_number":1351,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_deaa6e19","line":1348,"range":{"start_line":1348,"start_character":17,"end_line":1348,"end_character":67},"updated":"2018-11-23 21:34:16.000000000","message":"Doesn\u0027t we need to do the same in bulk creation?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":1345,"context_line":"        port_id \u003d p.get(\u0027id\u0027) or uuidutils.generate_uuid()"},{"line_number":1346,"context_line":"        network_id \u003d p[\u0027network_id\u0027]"},{"line_number":1347,"context_line":"        if p.get(\u0027device_owner\u0027):"},{"line_number":1348,"context_line":"            self._enforce_device_owner_not_router_intf_or_device_id("},{"line_number":1349,"context_line":"                context, p.get(\u0027device_owner\u0027), p.get(\u0027device_id\u0027),"},{"line_number":1350,"context_line":"                p[\u0027tenant_id\u0027])"},{"line_number":1351,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_21d80c22","line":1348,"range":{"start_line":1348,"start_character":17,"end_line":1348,"end_character":67},"in_reply_to":"3f79a3b5_deaa6e19","updated":"2018-11-26 20:13:48.000000000","message":"True; I am not sure why I dropped this.  Done.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"73991cc372a2b73e18e66154ab0473172360ba4d","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            fixed_ips \u003d p[\u0027fixed_ips\u0027]"},{"line_number":1380,"context_line":"            if validators.is_attr_set(fixed_ips) and not fixed_ips:"},{"line_number":1381,"context_line":"                # [] was passed explicitly as fixed_ips. An unaddressed port."},{"line_number":1382,"context_line":"                db_port[\u0027ip_allocation\u0027] \u003d ipalloc_apidef.IP_ALLOCATION_NONE"},{"line_number":1383,"context_line":""},{"line_number":1384,"context_line":"        return db_port"},{"line_number":1385,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_33d85f22","line":1382,"updated":"2018-11-26 20:38:56.000000000","message":"Is there a use case for supporting bulk creation of unaddressed ports?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"956d6d54ec7cb38e13f405b04cc38f21a22e16e6","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            fixed_ips \u003d p[\u0027fixed_ips\u0027]"},{"line_number":1380,"context_line":"            if validators.is_attr_set(fixed_ips) and not fixed_ips:"},{"line_number":1381,"context_line":"                # [] was passed explicitly as fixed_ips. An unaddressed port."},{"line_number":1382,"context_line":"                db_port[\u0027ip_allocation\u0027] \u003d ipalloc_apidef.IP_ALLOCATION_NONE"},{"line_number":1383,"context_line":""},{"line_number":1384,"context_line":"        return db_port"},{"line_number":1385,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_a9ac0236","line":1382,"in_reply_to":"3f79a3b5_33d85f22","updated":"2018-11-26 22:17:35.000000000","message":"Not that I know of, but I have asked a member of the Kuryr team to comment.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":14352,"name":"Antoni Segura Puimedon","email":"celebdor@gmail.com","username":"toni"},"change_message_id":"12ec36517b0f331b66a95f643fb22ed238769cf8","unresolved":false,"context_lines":[{"line_number":1379,"context_line":"            fixed_ips \u003d p[\u0027fixed_ips\u0027]"},{"line_number":1380,"context_line":"            if validators.is_attr_set(fixed_ips) and not fixed_ips:"},{"line_number":1381,"context_line":"                # [] was passed explicitly as fixed_ips. An unaddressed port."},{"line_number":1382,"context_line":"                db_port[\u0027ip_allocation\u0027] \u003d ipalloc_apidef.IP_ALLOCATION_NONE"},{"line_number":1383,"context_line":""},{"line_number":1384,"context_line":"        return db_port"},{"line_number":1385,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_20238e59","line":1382,"in_reply_to":"3f79a3b5_a9ac0236","updated":"2018-12-04 11:02:44.000000000","message":"We use bulk port creation of ports that should get either ipv4 or ipv6.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"73991cc372a2b73e18e66154ab0473172360ba4d","unresolved":false,"context_lines":[{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1303,"context_line":"        bulk_port_data \u003d []"},{"line_number":1304,"context_line":"        network_ids \u003d []"},{"line_number":1305,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1306,"context_line":"            for port in ports:"},{"line_number":1307,"context_line":"                fixed_ips \u003d port[\u0027port\u0027].get(\u0027fixed_ips\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_53ee3b8a","line":1304,"updated":"2018-11-26 20:38:56.000000000","message":"nit: it might be more efficient at L1327 if this were a set rather than a list, especially if you have a large list of ports on different networks to deal with. Although it is a very extreme edge case, using a set here is a pretty simple change that helps with those edge cases.","commit_id":"0f2a83ab4ecdc576acfde12a6f3bc24c769d266a"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fcbb5c5c485c19e67bbc21e664ce4441835702d4","unresolved":false,"context_lines":[{"line_number":1301,"context_line":""},{"line_number":1302,"context_line":"    def create_port_obj_bulk(self, context, ports):"},{"line_number":1303,"context_line":"        bulk_port_data \u003d []"},{"line_number":1304,"context_line":"        network_ids \u003d []"},{"line_number":1305,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1306,"context_line":"            for port in ports:"},{"line_number":1307,"context_line":"                fixed_ips \u003d port[\u0027port\u0027].get(\u0027fixed_ips\u0027)"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_cc314cf0","line":1304,"in_reply_to":"3f79a3b5_53ee3b8a","updated":"2018-11-26 22:26:03.000000000","message":"Done","commit_id":"0f2a83ab4ecdc576acfde12a6f3bc24c769d266a"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"9c3d94ad686cc1f118443f770f06987869d6524a","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(len(port_data))"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                mac_address \u003d netaddr.EUI(macs.pop(), 48)"},{"line_number":1276,"context_line":"                db_port_obj \u003d port_obj.Port(context,"},{"line_number":1277,"context_line":"                                            mac_address\u003dmac_address,"},{"line_number":1278,"context_line":"                                            id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_f363aeaa","line":1275,"updated":"2018-11-27 18:49:21.000000000","message":"I think we could end up with MAC addresses passed to us in the port_data. Should we honor those requests, or simply not support requesting a MAC address on a bulk request and raise an exception? It looks to me like this would silently ignore the request of the user, so no matter what we choose to support I think we need to handle that case here.","commit_id":"5d73785f185c6fc858f11ea716c450b9e1611bd7"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"0d956a5167b6d4b77b0a3e29b1a1001c7c63f53c","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(len(port_data))"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                mac_address \u003d netaddr.EUI(macs.pop(), 48)"},{"line_number":1276,"context_line":"                db_port_obj \u003d port_obj.Port(context,"},{"line_number":1277,"context_line":"                                            mac_address\u003dmac_address,"},{"line_number":1278,"context_line":"                                            id\u003duuidutils.generate_uuid(),"}],"source_content_type":"text/x-python","patch_set":22,"id":"3f79a3b5_96926848","line":1275,"in_reply_to":"3f79a3b5_f363aeaa","updated":"2018-11-27 19:30:16.000000000","message":"I think it\u0027s pretty low overhead to support it if a MAC address is requested, and I could imagine such a thing being needed.  Added like so:\n\n    mac_address \u003d netaddr.EUI(port_data.get(\u0027mac_address\u0027,\n        macs.pop()), 48)","commit_id":"5d73785f185c6fc858f11ea716c450b9e1611bd7"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"df165acacdd4110c0b370b9ee713c5381182678e","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(len(port_data))"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                mac_address \u003d netaddr.EUI(port_data.get(\u0027mac_address\u0027,"},{"line_number":1276,"context_line":"                                                        macs.pop()), 48)"},{"line_number":1277,"context_line":"                db_port_obj \u003d port_obj.Port(context,"},{"line_number":1278,"context_line":"                                            mac_address\u003dmac_address,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_9f983b19","line":1275,"range":{"start_line":1275,"start_character":42,"end_line":1275,"end_character":69},"updated":"2018-11-27 22:09:04.000000000","message":"Cool, this works for me.","commit_id":"e9777186aa6642023cdef0bb46d4b1a9a5694dfd"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"54d5ab08140d76281cb5b86ae4fde6fca57a1a98","unresolved":false,"context_lines":[{"line_number":1272,"context_line":"        macs \u003d self._generate_macs(len(port_data))"},{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                mac_address \u003d netaddr.EUI(port_data.get(\u0027mac_address\u0027,"},{"line_number":1276,"context_line":"                                                        macs.pop()), 48)"},{"line_number":1277,"context_line":"                db_port_obj \u003d port_obj.Port(context,"},{"line_number":1278,"context_line":"                                            mac_address\u003dmac_address,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_b7f3cc6d","line":1275,"range":{"start_line":1275,"start_character":42,"end_line":1275,"end_character":69},"in_reply_to":"3f79a3b5_9f983b19","updated":"2018-11-28 16:16:12.000000000","message":"I actually had to change this, because an unset mac address is not None; it will be constants.ATTR_NOT_SPECIFIED which does not trigger the fallthrough part of the .get().","commit_id":"e9777186aa6642023cdef0bb46d4b1a9a5694dfd"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f4a94dcc21267eae1341bb86befe481c7b78a7b0","unresolved":false,"context_lines":[{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                raw_mac_address \u003d port.pop(\u0027mac_address\u0027,"},{"line_number":1276,"context_line":"                        constants.ATTR_NOT_SPECIFIED)"},{"line_number":1277,"context_line":"                if raw_mac_address is constants.ATTR_NOT_SPECIFIED: "},{"line_number":1278,"context_line":"                    raw_mac_address \u003d macs.pop()"},{"line_number":1279,"context_line":"                eui_mac_address \u003d netaddr.EUI(raw_mac_address, 48)"},{"line_number":1280,"context_line":"                db_port_obj \u003d port_obj.Port(context,"}],"source_content_type":"text/x-python","patch_set":24,"id":"3f79a3b5_df6d3e9a","line":1277,"range":{"start_line":1277,"start_character":67,"end_line":1277,"end_character":68},"updated":"2018-11-28 18:02:14.000000000","message":"Whitespace","commit_id":"150f959bb95f6d3ee79c00f0d44ab45f3a0ff226"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6c27ec688e2b9ca00b6f9a87a33f8c22a7de5520","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                raw_mac_address \u003d port.pop(\u0027mac_address\u0027,"},{"line_number":1276,"context_line":"                        constants.ATTR_NOT_SPECIFIED)"},{"line_number":1277,"context_line":"                if raw_mac_address is constants.ATTR_NOT_SPECIFIED:"},{"line_number":1278,"context_line":"                    raw_mac_address \u003d macs.pop()"},{"line_number":1279,"context_line":"                eui_mac_address \u003d netaddr.EUI(raw_mac_address, 48)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_ba5649f9","line":1276,"updated":"2018-11-29 02:23:59.000000000","message":"super nit: indentation","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fa6293c06812ed3e406ce838955141123fdbed8e","unresolved":false,"context_lines":[{"line_number":1273,"context_line":"        with db_api.CONTEXT_WRITER.using(context):"},{"line_number":1274,"context_line":"            for port in port_data:"},{"line_number":1275,"context_line":"                raw_mac_address \u003d port.pop(\u0027mac_address\u0027,"},{"line_number":1276,"context_line":"                        constants.ATTR_NOT_SPECIFIED)"},{"line_number":1277,"context_line":"                if raw_mac_address is constants.ATTR_NOT_SPECIFIED:"},{"line_number":1278,"context_line":"                    raw_mac_address \u003d macs.pop()"},{"line_number":1279,"context_line":"                eui_mac_address \u003d netaddr.EUI(raw_mac_address, 48)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_8a21b40c","line":1276,"in_reply_to":"3f79a3b5_ba5649f9","updated":"2018-11-29 15:07:09.000000000","message":"Done","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6c27ec688e2b9ca00b6f9a87a33f8c22a7de5520","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"                         mac_address\u003dpdata.get(\u0027mac_address\u0027),"},{"line_number":1326,"context_line":"                         device_id\u003dpdata.get(\u0027device_id\u0027),"},{"line_number":1327,"context_line":"                         device_owner\u003dpdata.get(\u0027device_owner\u0027),"},{"line_number":1328,"context_line":"                         description\u003dpdata.get(\u0027description\u0027)))"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"            # Ensure that the networks exist."},{"line_number":1331,"context_line":"            network_id \u003d pdata.get(\u0027network_id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_3aa0f9f2","line":1328,"updated":"2018-11-29 02:23:59.000000000","message":"super nit: indentation","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fa6293c06812ed3e406ce838955141123fdbed8e","unresolved":false,"context_lines":[{"line_number":1325,"context_line":"                         mac_address\u003dpdata.get(\u0027mac_address\u0027),"},{"line_number":1326,"context_line":"                         device_id\u003dpdata.get(\u0027device_id\u0027),"},{"line_number":1327,"context_line":"                         device_owner\u003dpdata.get(\u0027device_owner\u0027),"},{"line_number":1328,"context_line":"                         description\u003dpdata.get(\u0027description\u0027)))"},{"line_number":1329,"context_line":""},{"line_number":1330,"context_line":"            # Ensure that the networks exist."},{"line_number":1331,"context_line":"            network_id \u003d pdata.get(\u0027network_id\u0027)"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_aa26f020","line":1328,"in_reply_to":"3f79a3b5_3aa0f9f2","updated":"2018-11-29 15:07:09.000000000","message":"Done","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"}],"neutron/db/ipam_pluggable_backend.py":[{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"7fb36c88c4e34d4a52a5e6d86a8b6b30d5850094","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        if isinstance(port, dict):"},{"line_number":172,"context_line":"            port_copy \u003d {\u0027port\u0027: port[\u0027port\u0027].copy()}"},{"line_number":173,"context_line":"        else:"},{"line_number":174,"context_line":"            port_copy \u003d {\u0027port\u0027: dict(port)}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        port_copy[\u0027port\u0027][\u0027id\u0027] \u003d port_id"},{"line_number":177,"context_line":"        network_id \u003d port_copy[\u0027port\u0027][\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_defcae41","line":174,"range":{"start_line":174,"start_character":33,"end_line":174,"end_character":43},"updated":"2018-11-23 21:07:38.000000000","message":"Use the OVO\u0027s to_dict() method is better: https://github.com/openstack/neutron/blob/94703e1e4242698cf1f5b9bec0856e23a89a6880/neutron/objects/base.py#L151","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        if isinstance(port, dict):"},{"line_number":172,"context_line":"            port_copy \u003d {\u0027port\u0027: port[\u0027port\u0027].copy()}"},{"line_number":173,"context_line":"        else:"},{"line_number":174,"context_line":"            port_copy \u003d {\u0027port\u0027: dict(port)}"},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"        port_copy[\u0027port\u0027][\u0027id\u0027] \u003d port_id"},{"line_number":177,"context_line":"        network_id \u003d port_copy[\u0027port\u0027][\u0027network_id\u0027]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_01e150ce","line":174,"range":{"start_line":174,"start_character":33,"end_line":174,"end_character":43},"in_reply_to":"3f79a3b5_defcae41","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"}],"neutron/plugins/ml2/common/exceptions.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"c5afd2fe45fd70033b543f73cf7dceeba012cbce","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fived IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IPs cannot be requested from a bulk port allocation\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_92fced0e","line":46,"range":{"start_line":46,"start_character":26,"end_line":46,"end_character":31},"updated":"2018-11-23 15:18:41.000000000","message":"nitty nit: s/fived/fixed","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":43,"context_line":""},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fived IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IPs cannot be requested from a bulk port allocation\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_2101ec6d","line":46,"range":{"start_line":46,"start_character":26,"end_line":46,"end_character":31},"in_reply_to":"3f79a3b5_92fced0e","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"73991cc372a2b73e18e66154ab0473172360ba4d","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IPs cannot be requested from a bulk port allocation\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_939db3fe","line":47,"updated":"2018-11-26 20:38:56.000000000","message":"nit: \"Fixed IP addresses\"","commit_id":"0f2a83ab4ecdc576acfde12a6f3bc24c769d266a"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fcbb5c5c485c19e67bbc21e664ce4441835702d4","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IPs cannot be requested from a bulk port allocation\")"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":""},{"line_number":50,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"}],"source_content_type":"text/x-python","patch_set":19,"id":"3f79a3b5_6c411837","line":47,"in_reply_to":"3f79a3b5_939db3fe","updated":"2018-11-26 22:26:03.000000000","message":"Done","commit_id":"0f2a83ab4ecdc576acfde12a6f3bc24c769d266a"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6c27ec688e2b9ca00b6f9a87a33f8c22a7de5520","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IP addresses cannot be requested from a bulk port\""},{"line_number":48,"context_line":"                \"allocation\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_faa121f6","line":47,"range":{"start_line":47,"start_character":68,"end_line":47,"end_character":72},"updated":"2018-11-29 02:23:59.000000000","message":"s/port\u003cspace\u003e","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fa6293c06812ed3e406ce838955141123fdbed8e","unresolved":false,"context_lines":[{"line_number":44,"context_line":""},{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IP addresses cannot be requested from a bulk port\""},{"line_number":48,"context_line":"                \"allocation\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_2a32e05c","line":47,"range":{"start_line":47,"start_character":68,"end_line":47,"end_character":72},"in_reply_to":"3f79a3b5_faa121f6","updated":"2018-11-29 15:07:09.000000000","message":"Done","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"6c27ec688e2b9ca00b6f9a87a33f8c22a7de5520","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IP addresses cannot be requested from a bulk port\""},{"line_number":48,"context_line":"                \"allocation\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_9aaeede3","line":48,"updated":"2018-11-29 02:23:59.000000000","message":"missing period","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"fa6293c06812ed3e406ce838955141123fdbed8e","unresolved":false,"context_lines":[{"line_number":45,"context_line":"class BulkPortCannotHaveFixedIpError(exceptions.InvalidInput):"},{"line_number":46,"context_line":"    \"\"\"You cannot request fixed IP addresses in a bulk port request.\"\"\""},{"line_number":47,"context_line":"    message \u003d _(\"Fixed IP addresses cannot be requested from a bulk port\""},{"line_number":48,"context_line":"                \"allocation\")"},{"line_number":49,"context_line":""},{"line_number":50,"context_line":""},{"line_number":51,"context_line":"class UnknownNetworkType(exceptions.NeutronException):"}],"source_content_type":"text/x-python","patch_set":25,"id":"3f79a3b5_ca3ecc26","line":48,"in_reply_to":"3f79a3b5_9aaeede3","updated":"2018-11-29 15:07:09.000000000","message":"Done","commit_id":"a96d5ad87de234a10d9a41bcdda062e1c338097f"}],"neutron/tests/unit/db/test_db_base_plugin_v2.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ea2cfe38f5449761706978e15e16c883df5772bc","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            else:"},{"line_number":799,"context_line":"                self.assertEqual(keys[k], resource[res_name][k])"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_8226bbcb","line":801,"updated":"2018-11-08 20:22:38.000000000","message":"Seems like this test should live in class TestPortsV2 ?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"f042bcce2dc33733817a18e22f155856da59b3bc","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            else:"},{"line_number":799,"context_line":"                self.assertEqual(keys[k], resource[res_name][k])"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_bdf51886","line":801,"in_reply_to":"3f79a3b5_8226bbcb","updated":"2018-11-08 20:54:45.000000000","message":"Aren\u0027t there already tests that assert bulk port creation? These this seems to be redundant. I don\u0027t see where create_port_obj_bulk() is actually plumbed in anywhere. If it was plumbed in, wouldn\u0027t the existing tests give us coverage the coverage we\u0027re looking for?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            else:"},{"line_number":799,"context_line":"                self.assertEqual(keys[k], resource[res_name][k])"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_d7c75e3e","line":801,"in_reply_to":"3f79a3b5_8226bbcb","updated":"2018-11-12 23:22:48.000000000","message":"Moved.","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":798,"context_line":"            else:"},{"line_number":799,"context_line":"                self.assertEqual(keys[k], resource[res_name][k])"},{"line_number":800,"context_line":""},{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_b7ce6256","line":801,"in_reply_to":"3f79a3b5_bdf51886","updated":"2018-11-12 23:22:48.000000000","message":"This test case was requested by manjeets in PS3.  When you say \u0027plumb in\u0027, do you mean attach it to the object-type-agnostic create_bulk capabilities?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ea2cfe38f5449761706978e15e16c883df5772bc","unresolved":false,"context_lines":[{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"},{"line_number":805,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":806,"context_line":"        device_owner \u003d \"me\""},{"line_number":807,"context_line":"        with optional_ctx(None, self.network,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_220fa738","line":804,"updated":"2018-11-08 20:22:38.000000000","message":"Should this be plugin \u003d directory.get_plugin() ?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":801,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":802,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":803,"context_line":"        num_ports \u003d 4"},{"line_number":804,"context_line":"        plugin \u003d neutron.db.db_base_plugin_v2.NeutronDbPluginV2()"},{"line_number":805,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":806,"context_line":"        device_owner \u003d \"me\""},{"line_number":807,"context_line":"        with optional_ctx(None, self.network,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_f7edbab9","line":804,"in_reply_to":"3f79a3b5_220fa738","updated":"2018-11-12 23:22:48.000000000","message":"Done","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"ea2cfe38f5449761706978e15e16c883df5772bc","unresolved":false,"context_lines":[{"line_number":805,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":806,"context_line":"        device_owner \u003d \"me\""},{"line_number":807,"context_line":"        with optional_ctx(None, self.network,"},{"line_number":808,"context_line":"                          tenant_id\u003dtenant_id) as network_to_use:"},{"line_number":809,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":810,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":811,"context_line":"            port \u003d {\u0027port\u0027: {\u0027name\u0027: \u0027port\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_2236c702","line":808,"updated":"2018-11-08 20:22:38.000000000","message":"If the first argument to optional_ctx() is None, it will just return the second(**kwargs), so maybe this should just be with self.network(...) ?","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"7c0fd23b4f60cfdcb898d56470f78055fbdf3dab","unresolved":false,"context_lines":[{"line_number":805,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":806,"context_line":"        device_owner \u003d \"me\""},{"line_number":807,"context_line":"        with optional_ctx(None, self.network,"},{"line_number":808,"context_line":"                          tenant_id\u003dtenant_id) as network_to_use:"},{"line_number":809,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":810,"context_line":"            ctx \u003d context.get_admin_context()"},{"line_number":811,"context_line":"            port \u003d {\u0027port\u0027: {\u0027name\u0027: \u0027port\u0027,"}],"source_content_type":"text/x-python","patch_set":12,"id":"3f79a3b5_37fc9270","line":808,"in_reply_to":"3f79a3b5_2236c702","updated":"2018-11-12 23:22:48.000000000","message":"Done","commit_id":"efa02693247c826a02981b506922e30148109d15"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"c44c79601c9635ebb469c18f25dca0410c144bdd","unresolved":false,"context_lines":[{"line_number":2580,"context_line":"        self._test_delete_ports_ignores_port_not_found(plugin)"},{"line_number":2581,"context_line":""},{"line_number":2582,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":2583,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":2584,"context_line":"        num_ports \u003d 4"},{"line_number":2585,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2586,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_3e38e69c","line":2583,"updated":"2018-11-13 12:10:23.000000000","message":"1) Are you trying to test something related to wrong MACs? Sorry, I don\u0027t see why are you introducing a wrong MAC, I\u0027m missing.\n\n2) You are breaking the other tests! Please, mock this value just only for this test.","commit_id":"f1b824f07559a51ceca1e9a5a1ee94688746c513"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"cf03b70c4ab7faec0effdb9fa7f477faac237a53","unresolved":false,"context_lines":[{"line_number":2580,"context_line":"        self._test_delete_ports_ignores_port_not_found(plugin)"},{"line_number":2581,"context_line":""},{"line_number":2582,"context_line":"    def test_create_port_obj_bulk(self):"},{"line_number":2583,"context_line":"        cfg.CONF.base_mac \u003d \"12:34:56:00\""},{"line_number":2584,"context_line":"        num_ports \u003d 4"},{"line_number":2585,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2586,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"3f79a3b5_fe4caecb","line":2583,"in_reply_to":"3f79a3b5_3e38e69c","updated":"2018-11-13 12:45:50.000000000","message":"1) The way the bulk mac address creation functionality (that is called from inside create_port_obj_bulk) works, neutron is configured with a base mac prefix and the code generates random MAC addresses within that prefix.  So I just need to make sure that the config value is set properly for that functionality to work.\n\n2) Thanks, I had meant to come back and replace this with a proper override.","commit_id":"f1b824f07559a51ceca1e9a5a1ee94688746c513"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f7f02b2325ff873d33b03e182aa124cec8ad520e","unresolved":false,"context_lines":[{"line_number":2599,"context_line":"                             \u0027tenant_id\u0027: tenant_id}}"},{"line_number":2600,"context_line":"            ports \u003d [port for x in range(num_ports)]"},{"line_number":2601,"context_line":"            port_data \u003d plugin.create_port_obj_bulk(ctx, ports)"},{"line_number":2602,"context_line":"            self.assertEqual(num_ports, len(port_data))"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"    def test_create_port_obj_bulk_with_fixed_ips(self):"},{"line_number":2605,"context_line":"        num_ports \u003d 4"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_d934c8e2","line":2602,"range":{"start_line":2602,"start_character":44,"end_line":2602,"end_character":53},"updated":"2018-11-23 21:34:16.000000000","message":"Better to verify if we get the expected data in here. For example, it should has an allocated IP and generated MAC","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":2599,"context_line":"                             \u0027tenant_id\u0027: tenant_id}}"},{"line_number":2600,"context_line":"            ports \u003d [port for x in range(num_ports)]"},{"line_number":2601,"context_line":"            port_data \u003d plugin.create_port_obj_bulk(ctx, ports)"},{"line_number":2602,"context_line":"            self.assertEqual(num_ports, len(port_data))"},{"line_number":2603,"context_line":""},{"line_number":2604,"context_line":"    def test_create_port_obj_bulk_with_fixed_ips(self):"},{"line_number":2605,"context_line":"        num_ports \u003d 4"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_4193c8ff","line":2602,"range":{"start_line":2602,"start_character":44,"end_line":2602,"end_character":53},"in_reply_to":"3f79a3b5_d934c8e2","updated":"2018-11-26 20:13:48.000000000","message":"Done","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":27654,"name":"Hongbin Lu","email":"kira034@163.com","username":"hongbin.lu"},"change_message_id":"f7f02b2325ff873d33b03e182aa124cec8ad520e","unresolved":false,"context_lines":[{"line_number":2606,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2607,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":2608,"context_line":"        device_owner \u003d \"me\""},{"line_number":2609,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":2610,"context_line":"        with self.network(tenant_id\u003dtenant_id) as network_to_use:"},{"line_number":2611,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":2612,"context_line":"            fixed_ip \u003d [dict(ip_address\u003d\u002710.0.0.5\u0027)]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_3e0e023c","line":2609,"range":{"start_line":2609,"start_character":8,"end_line":2609,"end_character":41},"updated":"2018-11-23 21:34:16.000000000","message":"why it is using admin context in here?","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"ce3661e03c4fe9a94821202e079b01ed9427162a","unresolved":false,"context_lines":[{"line_number":2606,"context_line":"        plugin \u003d directory.get_plugin()"},{"line_number":2607,"context_line":"        tenant_id \u003d \u0027some_tenant\u0027"},{"line_number":2608,"context_line":"        device_owner \u003d \"me\""},{"line_number":2609,"context_line":"        ctx \u003d context.get_admin_context()"},{"line_number":2610,"context_line":"        with self.network(tenant_id\u003dtenant_id) as network_to_use:"},{"line_number":2611,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":2612,"context_line":"            fixed_ip \u003d [dict(ip_address\u003d\u002710.0.0.5\u0027)]"}],"source_content_type":"text/x-python","patch_set":18,"id":"3f79a3b5_a1f41c89","line":2609,"range":{"start_line":2609,"start_character":8,"end_line":2609,"end_character":41},"in_reply_to":"3f79a3b5_3e0e023c","updated":"2018-11-26 20:13:48.000000000","message":"Ah, I made that change in the first test but forgot to also make the same change here.  Thanks.","commit_id":"ab96b11df4176d6aaa5cd2f6ff8b0bfadac4b8f9"},{"author":{"_account_id":4187,"name":"Ryan Tidwell","email":"rtidwell@suse.com","username":"ryan-tidwell"},"change_message_id":"df165acacdd4110c0b370b9ee713c5381182678e","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":2593,"context_line":"            port \u003d {\u0027port\u0027: {\u0027name\u0027: \u0027port\u0027,"},{"line_number":2594,"context_line":"                             \u0027network_id\u0027: net_id,"},{"line_number":2595,"context_line":"                             \u0027mac_address\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":2596,"context_line":"                             \u0027fixed_ips\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":2597,"context_line":"                             \u0027admin_state_up\u0027: True,"},{"line_number":2598,"context_line":"                             \u0027device_id\u0027: \u0027device_id\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_7fae7f31","line":2595,"updated":"2018-11-27 22:09:04.000000000","message":"Is a test where MAC addresses are passed warranted?","commit_id":"e9777186aa6642023cdef0bb46d4b1a9a5694dfd"},{"author":{"_account_id":13995,"name":"Nate Johnston","email":"nate.johnston@redhat.com","username":"natejohnston"},"change_message_id":"54d5ab08140d76281cb5b86ae4fde6fca57a1a98","unresolved":false,"context_lines":[{"line_number":2592,"context_line":"            net_id \u003d network_to_use[\u0027network\u0027][\u0027id\u0027]"},{"line_number":2593,"context_line":"            port \u003d {\u0027port\u0027: {\u0027name\u0027: \u0027port\u0027,"},{"line_number":2594,"context_line":"                             \u0027network_id\u0027: net_id,"},{"line_number":2595,"context_line":"                             \u0027mac_address\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":2596,"context_line":"                             \u0027fixed_ips\u0027: constants.ATTR_NOT_SPECIFIED,"},{"line_number":2597,"context_line":"                             \u0027admin_state_up\u0027: True,"},{"line_number":2598,"context_line":"                             \u0027device_id\u0027: \u0027device_id\u0027,"}],"source_content_type":"text/x-python","patch_set":23,"id":"3f79a3b5_b7daece3","line":2595,"in_reply_to":"3f79a3b5_7fae7f31","updated":"2018-11-28 16:16:12.000000000","message":"I implemented one; check it out.","commit_id":"e9777186aa6642023cdef0bb46d4b1a9a5694dfd"}]}
