)]}'
{"etc/neutron/plugins/nicira/nvp.ini":[{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":182,"context_line":"# metadata_server_port \u003d 8775"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"# When proxying metadata requests, Neutron signs the Instance-ID header with a"},{"line_number":185,"context_line":"# shared secret to prevent spoofing.  You may select any string for a secret,"},{"line_number":186,"context_line":"# but it *MUST* match with the configuration used by the Metadata server"},{"line_number":187,"context_line":"# metadata_shared_secret \u003d"}],"source_content_type":"text/x-properties","patch_set":18,"id":"AAAATn%2F9FXI%3D","line":185,"updated":"2013-12-16 23:40:43.000000000","message":"meh are there really two spaces in the line above?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":182,"context_line":"# metadata_server_port \u003d 8775"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":"# When proxying metadata requests, Neutron signs the Instance-ID header with a"},{"line_number":185,"context_line":"# shared secret to prevent spoofing.  You may select any string for a secret,"},{"line_number":186,"context_line":"# but it *MUST* match with the configuration used by the Metadata server"},{"line_number":187,"context_line":"# metadata_shared_secret \u003d"}],"source_content_type":"text/x-properties","patch_set":18,"id":"AAAATn%2F9BvA%3D","line":185,"in_reply_to":"AAAATn%2F9FXI%3D","updated":"2013-12-17 15:12:28.000000000","message":"Done","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"# When proxying metadata requests, Neutron signs the Instance-ID header with a"},{"line_number":185,"context_line":"# shared secret to prevent spoofing.  You may select any string for a secret,"},{"line_number":186,"context_line":"# but it *MUST* match with the configuration used by the Metadata server"},{"line_number":187,"context_line":"# metadata_shared_secret \u003d"}],"source_content_type":"text/x-properties","patch_set":18,"id":"AAAATn%2F9FXA%3D","line":186,"updated":"2013-12-16 23:40:43.000000000","message":"asterisks and capitals are offensive and intimidating.\nI now feel insecure and vulnerable.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":183,"context_line":""},{"line_number":184,"context_line":"# When proxying metadata requests, Neutron signs the Instance-ID header with a"},{"line_number":185,"context_line":"# shared secret to prevent spoofing.  You may select any string for a secret,"},{"line_number":186,"context_line":"# but it *MUST* match with the configuration used by the Metadata server"},{"line_number":187,"context_line":"# metadata_shared_secret \u003d"}],"source_content_type":"text/x-properties","patch_set":18,"id":"AAAATn%2F9Bu8%3D","line":186,"in_reply_to":"AAAATn%2F9FXA%3D","updated":"2013-12-17 15:12:28.000000000","message":"Done","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"662b99b19c79c14f20bf0e39aa502dcaf0e7f5b4","unresolved":false,"context_lines":[{"line_number":179,"context_line":""},{"line_number":180,"context_line":"# When proxying metadata requests, Neutron signs the Instance-ID header with a"},{"line_number":181,"context_line":"# shared secret to prevent spoofing. You may select any string for a secret,"},{"line_number":182,"context_line":"# but it MUST match with the configuration used by the Metadata server"},{"line_number":183,"context_line":"# metadata_shared_secret \u003d"}],"source_content_type":"text/x-properties","patch_set":19,"id":"AAAATn%2F8%2FaE%3D","line":182,"updated":"2013-12-18 20:28:12.000000000","message":"I think we should change this to *MUST* to emphase this more :)","commit_id":"8f3a54f0474e263aff886d671624faa1dc8d223c"}],"neutron/plugins/nicira/dhcp_meta/nvp.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron.plugins.nicira import nvplib"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":"METADATA_MAC \u003d \"aa:bb:cc:dd:ee:ff\""},{"line_number":33,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":34,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":35,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fxto%3D","line":32,"updated":"2013-10-10 00:04:03.000000000","message":"Do we store this mac address in the port table? We want to make sure that someone doesn\u0027t do a create_port and specify this mac as well which would mess up l2 forwarding. Why not have it randomly generated like we do today if one doesn\u0027t specify a mac on port_create?","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"632d51aee0a046f64d1f683b8196f7ec4c321df4","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron.plugins.nicira import nvplib"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":"METADATA_MAC \u003d \"aa:bb:cc:dd:ee:ff\""},{"line_number":33,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":34,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":35,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FPdM%3D","line":32,"in_reply_to":"AAAATH%2F%2FPeY%3D","updated":"2013-10-19 18:57:16.000000000","message":"Thanks for pointing that out, but this mac is not exposed to neutron at all, it\u0027s used internally in NSX so I am not sure it\u0027s worth following this convention, unless I am missing something.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"3682bc1a473bb6b8ea485d7027fcd058b9dee34b","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron.plugins.nicira import nvplib"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":"METADATA_MAC \u003d \"aa:bb:cc:dd:ee:ff\""},{"line_number":33,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":34,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":35,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FPeY%3D","line":32,"in_reply_to":"AAAATH%2F%2Fu98%3D","updated":"2013-10-19 18:29:59.000000000","message":"The neutron MAC addresses have a prefix - https://github.com/openstack/neutron/blob/master/etc/neutron.conf#L64\nI guess to really be safe this could be a configuration variable.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93334dc3c3a256a1b8819575282689f507875f2f","unresolved":false,"context_lines":[{"line_number":29,"context_line":"from neutron.plugins.nicira import nvplib"},{"line_number":30,"context_line":""},{"line_number":31,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":32,"context_line":"METADATA_MAC \u003d \"aa:bb:cc:dd:ee:ff\""},{"line_number":33,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":34,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":35,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fu98%3D","line":32,"in_reply_to":"AAAATH%2F%2Fxto%3D","updated":"2013-10-10 14:48:28.000000000","message":"A conflict on the dhcp entry set up should prevent that from happening. Unfortunately I need a well-known MAC to do a lookup on when searching for the lsn port. This is a stop-gap solution ahead of performance improvements that I am going to introduce in a subsequent patch and that will replace part on the logic that relies on this metadata_mac. Bear with me while I am carrying out this work in multiple, fairly independent steps. I\u0027ll add a note, in case I get hit by the proverbial bus.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                return"},{"line_number":107,"context_line":"            dhcp_entries \u003d ["},{"line_number":108,"context_line":"                {\u0027mac_address\u0027: p[\u0027mac_address\u0027],"},{"line_number":109,"context_line":"                 \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":110,"context_line":"                for p in ports"},{"line_number":111,"context_line":"                if (p.get(\"fixed_ips\") and"},{"line_number":112,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxtU%3D","line":109,"updated":"2013-10-10 00:04:03.000000000","message":"It looks like your missing another for loop in here to loop; for ip_address in fixed_ips to handle the case where a port is assigned to multiple ip addresses.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93334dc3c3a256a1b8819575282689f507875f2f","unresolved":false,"context_lines":[{"line_number":106,"context_line":"                return"},{"line_number":107,"context_line":"            dhcp_entries \u003d ["},{"line_number":108,"context_line":"                {\u0027mac_address\u0027: p[\u0027mac_address\u0027],"},{"line_number":109,"context_line":"                 \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":110,"context_line":"                for p in ports"},{"line_number":111,"context_line":"                if (p.get(\"fixed_ips\") and"},{"line_number":112,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxqI%3D","line":109,"in_reply_to":"AAAATH%2F%2FxtU%3D","updated":"2013-10-10 14:48:28.000000000","message":"Good catch. I\u0027ll revise my approach throughout the code.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                 \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":110,"context_line":"                for p in ports"},{"line_number":111,"context_line":"                if (p.get(\"fixed_ips\") and"},{"line_number":112,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"},{"line_number":113,"context_line":"                    p[\u0027device_owner\u0027] !\u003d l3_db.DEVICE_OWNER_ROUTER_INTF)"},{"line_number":114,"context_line":"            ]"},{"line_number":115,"context_line":"            if dhcp_entries:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxsE%3D","line":112,"updated":"2013-10-10 00:04:03.000000000","message":"consider: since we do this check multiple times i think it\u0027s better to write it as: \n\ninvalid_metadata_ports \u003d [ const.DEVICE_OWNER_DHCP, l3_db.DEVICE_OWNER_ROUTER_INTF]\n\nif (p.get(\u0027fixed_ips\u0027) and p[\u0027device_owner\u0027] not in invalid_metadata_ports):","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93334dc3c3a256a1b8819575282689f507875f2f","unresolved":false,"context_lines":[{"line_number":109,"context_line":"                 \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":110,"context_line":"                for p in ports"},{"line_number":111,"context_line":"                if (p.get(\"fixed_ips\") and"},{"line_number":112,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"},{"line_number":113,"context_line":"                    p[\u0027device_owner\u0027] !\u003d l3_db.DEVICE_OWNER_ROUTER_INTF)"},{"line_number":114,"context_line":"            ]"},{"line_number":115,"context_line":"            if dhcp_entries:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxqE%3D","line":112,"in_reply_to":"AAAATH%2F%2FxsE%3D","updated":"2013-10-10 14:48:28.000000000","message":"good point.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":119,"context_line":"            meta_entries \u003d ["},{"line_number":120,"context_line":"                {\u0027instance_id\u0027: p[\u0027device_id\u0027],"},{"line_number":121,"context_line":"                 \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":122,"context_line":"                for p in ports"},{"line_number":123,"context_line":"                if (p[\u0027device_id\u0027] and"},{"line_number":124,"context_line":"                    p.get(\u0027fixed_ips\u0027) and"},{"line_number":125,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxtA%3D","line":122,"updated":"2013-10-10 00:04:03.000000000","message":"ditto","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":122,"context_line":"                for p in ports"},{"line_number":123,"context_line":"                if (p[\u0027device_id\u0027] and"},{"line_number":124,"context_line":"                    p.get(\u0027fixed_ips\u0027) and"},{"line_number":125,"context_line":"                    p[\u0027device_owner\u0027] !\u003d const.DEVICE_OWNER_DHCP and"},{"line_number":126,"context_line":"                    p[\u0027device_owner\u0027] !\u003d l3_db.DEVICE_OWNER_ROUTER_INTF)"},{"line_number":127,"context_line":"            ]"},{"line_number":128,"context_line":"            if meta_entries:"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fxs0%3D","line":125,"updated":"2013-10-10 00:04:03.000000000","message":"i wonder if we need to filter out ipv6 addresses here. I think the nvp_api only supports it with v4 as that\u0027s only what metadata works with today.","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":1653,"name":"garyk","email":"gkotton@vmware.com","username":"garyk"},"change_message_id":"2fc0251ffd947c4284d2694817b0f1a2274a842a","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"# A unique MAC to quickly identify the LSN port used for metadata services"},{"line_number":35,"context_line":"# when dhcp on the subnet is off. Inspired by leet-speak for \u0027metadata\u0027."},{"line_number":36,"context_line":"METADATA_MAC \u003d \"fa:15:73:74:d4:74\""},{"line_number":37,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":38,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":39,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FqOk%3D","line":36,"updated":"2013-10-30 18:24:20.000000000","message":"is this worth considering adding to the configuration file in the event that someone actually uses this mac address","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"# A unique MAC to quickly identify the LSN port used for metadata services"},{"line_number":35,"context_line":"# when dhcp on the subnet is off. Inspired by leet-speak for \u0027metadata\u0027."},{"line_number":36,"context_line":"METADATA_MAC \u003d \"fa:15:73:74:d4:74\""},{"line_number":37,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":38,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":39,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FWA%3D","line":36,"in_reply_to":"AAAATn%2F%2FqLg%3D","updated":"2013-12-16 23:40:43.000000000","message":"In the past I\u0027ve heard people complaining about MAC OUIs and overlaps with vendors OUIs.\nfa:15:73 is unknown, but I don\u0027t know if maybe we want to use the same OUI for all other interfaces (fa:16:3e, but that\u0027s configurable)","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"bc502cb5cb57a303bca84a10d7dc988e42ab6d7e","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"# A unique MAC to quickly identify the LSN port used for metadata services"},{"line_number":35,"context_line":"# when dhcp on the subnet is off. Inspired by leet-speak for \u0027metadata\u0027."},{"line_number":36,"context_line":"METADATA_MAC \u003d \"fa:15:73:74:d4:74\""},{"line_number":37,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":38,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":39,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F%2FqLg%3D","line":36,"in_reply_to":"AAAATn%2F%2FqOk%3D","updated":"2013-10-30 18:33:23.000000000","message":"why would the admin need to know about this? It\u0027s not like if we added it to the config file, this is going to prevent a potential conflict on a mac address. Guessing/generating this exact mac is rather unlucky, I\u0027d say. If that really were going to happen, then the user will get a conflict error and move on, just like it happens today if the user were to use the mac of the dhcp port. The only difference here is that the MAC is not auto-generated, which simplifies the lookup logic greatly.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"17e17cdc3aa6c2cdd09752cb38964e953c0d4a66","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"# A unique MAC to quickly identify the LSN port used for metadata services"},{"line_number":35,"context_line":"# when dhcp on the subnet is off. Inspired by leet-speak for \u0027metadata\u0027."},{"line_number":36,"context_line":"METADATA_MAC \u003d \"fa:15:73:74:d4:74\""},{"line_number":37,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":38,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":39,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BVA%3D","line":36,"in_reply_to":"AAAATn%2F9Buk%3D","updated":"2013-12-17 16:12:55.000000000","message":"My answer is \"I don\u0027t know\".\nIf there is a case, is surely not strong, and nothing we can do in a follow up patch.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":33,"context_line":"LOG \u003d logging.getLogger(__name__)"},{"line_number":34,"context_line":"# A unique MAC to quickly identify the LSN port used for metadata services"},{"line_number":35,"context_line":"# when dhcp on the subnet is off. Inspired by leet-speak for \u0027metadata\u0027."},{"line_number":36,"context_line":"METADATA_MAC \u003d \"fa:15:73:74:d4:74\""},{"line_number":37,"context_line":"METADATA_PORT_ID \u003d \u0027metadata:id\u0027"},{"line_number":38,"context_line":"METADATA_PORT_NAME \u003d \u0027metadata:name\u0027"},{"line_number":39,"context_line":"METADATA_DEVICE_ID \u003d \u0027metadata:device\u0027"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Buk%3D","line":36,"in_reply_to":"AAAATn%2F9FWA%3D","updated":"2013-12-17 15:12:28.000000000","message":"Being a \u0027service\u0027 MAC I feel this should be left \u0027unconfigurable\u0027\u0027; is there a strong case as to anyone should care about this MAC?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d8775,"},{"line_number":64,"context_line":"               help\u003d_(\"TCP Port used by Metadata server.\")),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027metadata_shared_secret\u0027,"},{"line_number":66,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":67,"context_line":"               help\u003d_(\u0027Shared secret to sign instance-id request\u0027),"},{"line_number":68,"context_line":"               secret\u003dTrue)"},{"line_number":69,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FVo%3D","line":66,"updated":"2013-12-16 23:40:43.000000000","message":"dumb question: is the empty string a valid configuration value?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":63,"context_line":"               default\u003d8775,"},{"line_number":64,"context_line":"               help\u003d_(\"TCP Port used by Metadata server.\")),"},{"line_number":65,"context_line":"    cfg.StrOpt(\u0027metadata_shared_secret\u0027,"},{"line_number":66,"context_line":"               default\u003d\u0027\u0027,"},{"line_number":67,"context_line":"               help\u003d_(\u0027Shared secret to sign instance-id request\u0027),"},{"line_number":68,"context_line":"               secret\u003dTrue)"},{"line_number":69,"context_line":"]"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Bug%3D","line":66,"in_reply_to":"AAAATn%2F9FVo%3D","updated":"2013-12-17 15:12:28.000000000","message":"Same default as:\n\nhttps://github.com/openstack/neutron/blob/master/neutron/agent/metadata/agent.py","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            if mac_address \u003d\u003d METADATA_MAC:"},{"line_number":191,"context_line":"                try:"},{"line_number":192,"context_line":"                    lswitch_port_id \u003d nvplib.get_port_by_neutron_tag("},{"line_number":193,"context_line":"                        self.cluster, network_id, METADATA_PORT_ID)[\u0027uuid\u0027]"},{"line_number":194,"context_line":"                    nvplib.delete_port("},{"line_number":195,"context_line":"                        self.cluster, network_id, lswitch_port_id)"},{"line_number":196,"context_line":"                except (n_exc.PortNotFoundOnNetwork,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FU8%3D","line":193,"updated":"2013-12-16 23:40:43.000000000","message":"for what is probably a nvplib bug nvplib.get_port_by_neutron_tag won\u0027t raise but return None if the port is not found.\n\nA keyerror can therefore be raised here; it should be prevented or handled","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"17e17cdc3aa6c2cdd09752cb38964e953c0d4a66","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            if mac_address \u003d\u003d METADATA_MAC:"},{"line_number":191,"context_line":"                try:"},{"line_number":192,"context_line":"                    lswitch_port_id \u003d nvplib.get_port_by_neutron_tag("},{"line_number":193,"context_line":"                        self.cluster, network_id, METADATA_PORT_ID)[\u0027uuid\u0027]"},{"line_number":194,"context_line":"                    nvplib.delete_port("},{"line_number":195,"context_line":"                        self.cluster, network_id, lswitch_port_id)"},{"line_number":196,"context_line":"                except (n_exc.PortNotFoundOnNetwork,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BU4%3D","line":193,"in_reply_to":"AAAATn%2F9Bt8%3D","updated":"2013-12-17 16:12:55.000000000","message":"ok your answer makes sense","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":190,"context_line":"            if mac_address \u003d\u003d METADATA_MAC:"},{"line_number":191,"context_line":"                try:"},{"line_number":192,"context_line":"                    lswitch_port_id \u003d nvplib.get_port_by_neutron_tag("},{"line_number":193,"context_line":"                        self.cluster, network_id, METADATA_PORT_ID)[\u0027uuid\u0027]"},{"line_number":194,"context_line":"                    nvplib.delete_port("},{"line_number":195,"context_line":"                        self.cluster, network_id, lswitch_port_id)"},{"line_number":196,"context_line":"                except (n_exc.PortNotFoundOnNetwork,"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Bt8%3D","line":193,"in_reply_to":"AAAATn%2F9FU8%3D","updated":"2013-12-17 15:12:28.000000000","message":"In practice if we get here, the port must be there, otherwise lsn_port_id would have been None and hence we wouldn\u0027t call get_port_by_neutron_tag. But I agree that I can make the code stronger.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            lsn_api.lsn_metadata_configure("},{"line_number":300,"context_line":"                self.cluster, lsn_id, is_enabled, metadata_options)"},{"line_number":301,"context_line":"        except (p_exc.LsnNotFound, nvplib.NvpApiClient.NvpApiException):"},{"line_number":302,"context_line":"            err_msg \u003d (_(\u0027Unable to configure metadata \u0027"},{"line_number":303,"context_line":"                         \u0027for subnet %s\u0027) % subnet_id)"},{"line_number":304,"context_line":"            LOG.error(err_msg)"},{"line_number":305,"context_line":"            raise p_exc.NvpPluginException(err_msg\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FS8%3D","line":302,"updated":"2013-12-16 23:40:43.000000000","message":"nit: metadata service or metadata access","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":299,"context_line":"            lsn_api.lsn_metadata_configure("},{"line_number":300,"context_line":"                self.cluster, lsn_id, is_enabled, metadata_options)"},{"line_number":301,"context_line":"        except (p_exc.LsnNotFound, nvplib.NvpApiClient.NvpApiException):"},{"line_number":302,"context_line":"            err_msg \u003d (_(\u0027Unable to configure metadata \u0027"},{"line_number":303,"context_line":"                         \u0027for subnet %s\u0027) % subnet_id)"},{"line_number":304,"context_line":"            LOG.error(err_msg)"},{"line_number":305,"context_line":"            raise p_exc.NvpPluginException(err_msg\u003derr_msg)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Bt0%3D","line":302,"in_reply_to":"AAAATn%2F9FS8%3D","updated":"2013-12-17 15:12:28.000000000","message":"Done","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                                 lsn_api.lsn_port_dhcp_host_remove)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def lsn_port_meta_host_add(self, context, network_id, subnet_id, host):"},{"line_number":341,"context_line":"        \"\"\"Add dhcp host entry to LSN port configuration.\"\"\""},{"line_number":342,"context_line":"        self._lsn_port_host_conf(context, network_id, subnet_id, host,"},{"line_number":343,"context_line":"                                 lsn_api.lsn_port_metadata_host_add)"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSk%3D","line":341,"updated":"2013-12-16 23:40:43.000000000","message":"dhcp \u003d\u003e metadata ?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":338,"context_line":"                                 lsn_api.lsn_port_dhcp_host_remove)"},{"line_number":339,"context_line":""},{"line_number":340,"context_line":"    def lsn_port_meta_host_add(self, context, network_id, subnet_id, host):"},{"line_number":341,"context_line":"        \"\"\"Add dhcp host entry to LSN port configuration.\"\"\""},{"line_number":342,"context_line":"        self._lsn_port_host_conf(context, network_id, subnet_id, host,"},{"line_number":343,"context_line":"                                 lsn_api.lsn_port_metadata_host_add)"},{"line_number":344,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Btw%3D","line":341,"in_reply_to":"AAAATn%2F9FSk%3D","updated":"2013-12-17 15:12:28.000000000","message":"Done","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                                 lsn_api.lsn_port_metadata_host_add)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def lsn_port_meta_host_remove(self, context, network_id, subnet_id, host):"},{"line_number":346,"context_line":"        \"\"\"Remove dhcp host entry from LSN port configuration.\"\"\""},{"line_number":347,"context_line":"        self._lsn_port_host_conf(context, network_id, subnet_id, host,"},{"line_number":348,"context_line":"                                 lsn_api.lsn_port_metadata_host_remove)"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSU%3D","line":346,"updated":"2013-12-16 23:40:43.000000000","message":"dhcp \u003d\u003e metadata","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":343,"context_line":"                                 lsn_api.lsn_port_metadata_host_add)"},{"line_number":344,"context_line":""},{"line_number":345,"context_line":"    def lsn_port_meta_host_remove(self, context, network_id, subnet_id, host):"},{"line_number":346,"context_line":"        \"\"\"Remove dhcp host entry from LSN port configuration.\"\"\""},{"line_number":347,"context_line":"        self._lsn_port_host_conf(context, network_id, subnet_id, host,"},{"line_number":348,"context_line":"                                 lsn_api.lsn_port_metadata_host_remove)"},{"line_number":349,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Bts%3D","line":346,"in_reply_to":"AAAATn%2F9FSU%3D","updated":"2013-12-17 15:12:28.000000000","message":"Done","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        filters \u003d {\u0027network_id\u0027: [network_id]}"},{"line_number":392,"context_line":"        # Because NVP does not support updating a single host entry we"},{"line_number":393,"context_line":"        # got to build the whole list from scratch and update in bulk"},{"line_number":394,"context_line":"        ports \u003d self.plugin.get_ports(context, filters)"},{"line_number":395,"context_line":"        if not ports:"},{"line_number":396,"context_line":"            return"},{"line_number":397,"context_line":"        dhcp_conf \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FSA%3D","line":394,"updated":"2013-12-16 23:40:43.000000000","message":"get_ports is still more expensive than listing the ports from the db. If we can leverage a db-level operation, that would be better.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"17e17cdc3aa6c2cdd09752cb38964e953c0d4a66","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        filters \u003d {\u0027network_id\u0027: [network_id]}"},{"line_number":392,"context_line":"        # Because NVP does not support updating a single host entry we"},{"line_number":393,"context_line":"        # got to build the whole list from scratch and update in bulk"},{"line_number":394,"context_line":"        ports \u003d self.plugin.get_ports(context, filters)"},{"line_number":395,"context_line":"        if not ports:"},{"line_number":396,"context_line":"            return"},{"line_number":397,"context_line":"        dhcp_conf \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BUg%3D","line":394,"in_reply_to":"AAAATn%2F9Btc%3D","updated":"2013-12-17 16:12:55.000000000","message":"pretty much, there are all the _extend functions called that we don\u0027t need however","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":391,"context_line":"        filters \u003d {\u0027network_id\u0027: [network_id]}"},{"line_number":392,"context_line":"        # Because NVP does not support updating a single host entry we"},{"line_number":393,"context_line":"        # got to build the whole list from scratch and update in bulk"},{"line_number":394,"context_line":"        ports \u003d self.plugin.get_ports(context, filters)"},{"line_number":395,"context_line":"        if not ports:"},{"line_number":396,"context_line":"            return"},{"line_number":397,"context_line":"        dhcp_conf \u003d ["}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9Btc%3D","line":394,"in_reply_to":"AAAATn%2F9FSA%3D","updated":"2013-12-17 15:12:28.000000000","message":"But with your shiny async work they are the same don\u0027t they?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"d7644702afc8d23db2cceef34ffd13e30590b7b2","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            {\u0027instance_id\u0027: p[\u0027device_id\u0027],"},{"line_number":404,"context_line":"             \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":405,"context_line":"            for p in ports if is_user_port(p, check_dev_id\u003dTrue)"},{"line_number":406,"context_line":"        ]"},{"line_number":407,"context_line":"        self.lsn_manager.lsn_port_update("},{"line_number":408,"context_line":"            context, network_id, subnet_id, dhcp\u003ddhcp_conf, meta\u003dmeta_conf)"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FQw%3D","line":406,"updated":"2013-12-16 23:40:43.000000000","message":"What about doing the iteration once in order to save some operations? This will make the routine more \u0027green\u0027","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":261,"name":"Salvatore Orlando","email":"salv.orlando@gmail.com","username":"salvatore-orlando"},"change_message_id":"17e17cdc3aa6c2cdd09752cb38964e953c0d4a66","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            {\u0027instance_id\u0027: p[\u0027device_id\u0027],"},{"line_number":404,"context_line":"             \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":405,"context_line":"            for p in ports if is_user_port(p, check_dev_id\u003dTrue)"},{"line_number":406,"context_line":"        ]"},{"line_number":407,"context_line":"        self.lsn_manager.lsn_port_update("},{"line_number":408,"context_line":"            context, network_id, subnet_id, dhcp\u003ddhcp_conf, meta\u003dmeta_conf)"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BSs%3D","line":406,"in_reply_to":"AAAATn%2F9BtQ%3D","updated":"2013-12-17 16:12:55.000000000","message":"meh let\u0027s prioritize readability","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":403,"context_line":"            {\u0027instance_id\u0027: p[\u0027device_id\u0027],"},{"line_number":404,"context_line":"             \u0027ip_address\u0027: p[\"fixed_ips\"][0][\u0027ip_address\u0027]}"},{"line_number":405,"context_line":"            for p in ports if is_user_port(p, check_dev_id\u003dTrue)"},{"line_number":406,"context_line":"        ]"},{"line_number":407,"context_line":"        self.lsn_manager.lsn_port_update("},{"line_number":408,"context_line":"            context, network_id, subnet_id, dhcp\u003ddhcp_conf, meta\u003dmeta_conf)"},{"line_number":409,"context_line":""}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BtQ%3D","line":406,"in_reply_to":"AAAATn%2F9FQw%3D","updated":"2013-12-17 15:12:28.000000000","message":"I tried, but it made the code less readable. Suggestions?","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"f62732ba49484b2c1bdef7e25650d77cc6327063","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            return"},{"line_number":566,"context_line":"        subnet_id \u003d port[\"fixed_ips\"][0][\u0027subnet_id\u0027]"},{"line_number":567,"context_line":"        host_data \u003d {"},{"line_number":568,"context_line":"            \"instance_id\": port[\"device_id\"],"},{"line_number":569,"context_line":"            \"ip_address\": port[\"fixed_ips\"][0][\u0027ip_address\u0027]"},{"line_number":570,"context_line":"        }"},{"line_number":571,"context_line":"        LOG.info(_(\"Configuring metadata entry for port %s\"), port)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9FNg%3D","line":568,"updated":"2013-12-16 23:44:40.000000000","message":"nit: need to add \"tenant_id\": port[\u0027tenant_id\u0027] here now.","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"10f36301045fe39c6cb4f8d4e4535667622fd972","unresolved":false,"context_lines":[{"line_number":565,"context_line":"            return"},{"line_number":566,"context_line":"        subnet_id \u003d port[\"fixed_ips\"][0][\u0027subnet_id\u0027]"},{"line_number":567,"context_line":"        host_data \u003d {"},{"line_number":568,"context_line":"            \"instance_id\": port[\"device_id\"],"},{"line_number":569,"context_line":"            \"ip_address\": port[\"fixed_ips\"][0][\u0027ip_address\u0027]"},{"line_number":570,"context_line":"        }"},{"line_number":571,"context_line":"        LOG.info(_(\"Configuring metadata entry for port %s\"), port)"}],"source_content_type":"text/x-python","patch_set":18,"id":"AAAATn%2F9BtM%3D","line":568,"in_reply_to":"AAAATn%2F9FNg%3D","updated":"2013-12-17 15:12:28.000000000","message":"Good point, now we can :)","commit_id":"7823b32919430ab4905f2b64a36b96b0123ad828"}],"neutron/tests/unit/nicira/test_dhcpmeta.py":[{"author":{"_account_id":4395,"name":"Aaron Rosen","email":"aaronorosen@gmail.com","username":"arosen"},"change_message_id":"97da3bf1e8ca805154aeeda233f3055e2f1d4d20","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.mock_client \u003d self.mock_client_p.start()"},{"line_number":35,"context_line":"        self.addCleanup(self.mock_client_p.stop)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_notify_port_update_raise_lsn_not_found(self):"},{"line_number":38,"context_line":"        port \u003d {"},{"line_number":39,"context_line":"            \u0027id\u0027: \u0027foo_port_id\u0027,"},{"line_number":40,"context_line":"            \u0027network_id\u0027: \u0027foo_network_id\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2FxrA%3D","line":37,"updated":"2013-10-10 00:04:03.000000000","message":"I like you\u0027re tests :)","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"},{"author":{"_account_id":748,"name":"Armando Migliaccio","email":"armamig@gmail.com","username":"armando-migliaccio"},"change_message_id":"93334dc3c3a256a1b8819575282689f507875f2f","unresolved":false,"context_lines":[{"line_number":34,"context_line":"        self.mock_client \u003d self.mock_client_p.start()"},{"line_number":35,"context_line":"        self.addCleanup(self.mock_client_p.stop)"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    def test_notify_port_update_raise_lsn_not_found(self):"},{"line_number":38,"context_line":"        port \u003d {"},{"line_number":39,"context_line":"            \u0027id\u0027: \u0027foo_port_id\u0027,"},{"line_number":40,"context_line":"            \u0027network_id\u0027: \u0027foo_network_id\u0027"}],"source_content_type":"text/x-python","patch_set":12,"id":"AAAATH%2F%2Fu9U%3D","line":37,"in_reply_to":"AAAATH%2F%2FxrA%3D","updated":"2013-10-10 14:48:28.000000000","message":"are you MOCKing me? :)","commit_id":"cc774d0043a5ede19a8c31238d524cb2ee670c5e"}]}
