)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"InfiniBand is computer-networking communications standard"},{"line_number":10,"context_line":"used in high-performance computing, features very high"},{"line_number":11,"context_line":"throughput and very low latency. Were ethernet uses MAC"},{"line_number":12,"context_line":"as unique identifier assigned to network interfaces,"},{"line_number":13,"context_line":"InfiniBand uses GID (Global Identifier). The difference is"},{"line_number":14,"context_line":"that MAC is 6 octets and GID is 20 octets. Moreover to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa69d971_fe63c93f","line":11,"updated":"2016-01-07 12:36:33.000000000","message":"Typo: \"Where\"","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"InfiniBand is computer-networking communications standard"},{"line_number":10,"context_line":"used in high-performance computing, features very high"},{"line_number":11,"context_line":"throughput and very low latency. Were ethernet uses MAC"},{"line_number":12,"context_line":"as unique identifier assigned to network interfaces,"},{"line_number":13,"context_line":"InfiniBand uses GID (Global Identifier). The difference is"},{"line_number":14,"context_line":"that MAC is 6 octets and GID is 20 octets. Moreover to be"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":2,"id":"fa69d971_ff3423fc","line":11,"in_reply_to":"fa69d971_fe63c93f","updated":"2016-01-07 13:28:44.000000000","message":"Done","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"}],"doc/source/webapi/v1.rst":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"2363a59964f25270dad2c2ee99ef588d0ec6deaf","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"**1.15**"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Increase the port address field to 60 characters"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"**1.14**"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"da6ed579_5082cb01","line":37,"updated":"2016-01-12 20:11:48.000000000","message":"We need to make sure that only versions 1.15 and above of the API can create a port using GID. Something like [0].\n\nAs-is, this patch allows even versions below 1.15 to accept GID. It\u0027s backward compatible, but when dealing with microversions of the API we want to make sure that a specific version supports exactly the same set of features across all Ironic clouds. See [1] for more information\n\n[0] https://github.com/openstack/ironic/blob/32d3e98ca5fbd8120d04ca22f18d4bbfa6483e25/ironic/api/controllers/v1/utils.py#L190-L199\n\n[1] http://lists.openstack.org/pipermail/openstack-dev/2015-June/065849.html","commit_id":"c38830d8fad9f1bb46f5046c187845fed0c75f03"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ccb249fff31f3a4c02fc461c09e18a8138d3b646","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"**1.15**"},{"line_number":36,"context_line":""},{"line_number":37,"context_line":"    Increase the port address field to 60 characters"},{"line_number":38,"context_line":""},{"line_number":39,"context_line":"**1.14**"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-rst","patch_set":8,"id":"7a5de9d1_291b8282","line":37,"in_reply_to":"da6ed579_5082cb01","updated":"2016-02-01 21:01:35.000000000","message":"Done","commit_id":"c38830d8fad9f1bb46f5046c187845fed0c75f03"}],"ironic/api/controllers/v1/port.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            return []"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @expose.expose(PortCollection, types.uuid_or_name, types.uuid,"},{"line_number":250,"context_line":"                   types.client_address, types.uuid, int, wtypes.text,"},{"line_number":251,"context_line":"                   wtypes.text, types.listtype)"},{"line_number":252,"context_line":"    def get_all(self, node\u003dNone, node_uuid\u003dNone, address\u003dNone, marker\u003dNone,"},{"line_number":253,"context_line":"                limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_b592849d","line":250,"updated":"2016-02-22 15:56:50.000000000","message":"Does it make sense to convert this to MAC if GID was passed during POST with version 1.16 and then GET happens with e.g. 1.15?","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":247,"context_line":"            return []"},{"line_number":248,"context_line":""},{"line_number":249,"context_line":"    @expose.expose(PortCollection, types.uuid_or_name, types.uuid,"},{"line_number":250,"context_line":"                   types.client_address, types.uuid, int, wtypes.text,"},{"line_number":251,"context_line":"                   wtypes.text, types.listtype)"},{"line_number":252,"context_line":"    def get_all(self, node\u003dNone, node_uuid\u003dNone, address\u003dNone, marker\u003dNone,"},{"line_number":253,"context_line":"                limit\u003dNone, sort_key\u003d\u0027id\u0027, sort_dir\u003d\u0027asc\u0027, fields\u003dNone):"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_d3ea8f73","line":250,"in_reply_to":"bae84128_b592849d","updated":"2016-02-23 13:46:27.000000000","message":"I think it will be confusing to the user.","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        new_port \u003d objects.Port(pecan.request.context,"},{"line_number":353,"context_line":"                                **port.as_dict())"},{"line_number":354,"context_line":"        api_utils.check_allow_gid_address(new_port.address)"},{"line_number":355,"context_line":"        new_port.create()"},{"line_number":356,"context_line":"        # Set the HTTP Location Header"},{"line_number":357,"context_line":"        pecan.response.location \u003d link.build_url(\u0027ports\u0027, new_port.uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_7a5e2b77","line":354,"updated":"2016-02-22 15:56:50.000000000","message":"i guess this check can be moved one line up, before object creation.","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":351,"context_line":""},{"line_number":352,"context_line":"        new_port \u003d objects.Port(pecan.request.context,"},{"line_number":353,"context_line":"                                **port.as_dict())"},{"line_number":354,"context_line":"        api_utils.check_allow_gid_address(new_port.address)"},{"line_number":355,"context_line":"        new_port.create()"},{"line_number":356,"context_line":"        # Set the HTTP Location Header"},{"line_number":357,"context_line":"        pecan.response.location \u003d link.build_url(\u0027ports\u0027, new_port.uuid)"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_537cbfb4","line":354,"in_reply_to":"bae84128_7a5e2b77","updated":"2016-02-23 13:46:27.000000000","message":"Done","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":353,"context_line":"        api_utils.check_allow_gid_address(port_dict[\u0027address\u0027])"},{"line_number":354,"context_line":"        new_port \u003d objects.Port(pecan.request.context,"},{"line_number":355,"context_line":"                                **port.as_dict())"},{"line_number":356,"context_line":"        new_port.create()"},{"line_number":357,"context_line":"        # Set the HTTP Location Header"},{"line_number":358,"context_line":"        pecan.response.location \u003d link.build_url(\u0027ports\u0027, new_port.uuid)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_fc9e0262","line":355,"updated":"2016-02-25 11:48:40.000000000","message":"**port_dict","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":352,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":353,"context_line":"        api_utils.check_allow_gid_address(port_dict[\u0027address\u0027])"},{"line_number":354,"context_line":"        new_port \u003d objects.Port(pecan.request.context,"},{"line_number":355,"context_line":"                                **port.as_dict())"},{"line_number":356,"context_line":"        new_port.create()"},{"line_number":357,"context_line":"        # Set the HTTP Location Header"},{"line_number":358,"context_line":"        pecan.response.location \u003d link.build_url(\u0027ports\u0027, new_port.uuid)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_742042f8","line":355,"in_reply_to":"bae84128_fc9e0262","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"}],"ironic/common/exception.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    _msg_fmt \u003d _(\"A node with UUID %(uuid)s already exists.\")"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class AddressAlreadyExists(Conflict):"},{"line_number":153,"context_line":"    _msg_fmt \u003d _(\"A port with MAC address or GID %(address)s already exists.\")"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_d5d2a8ff","line":152,"updated":"2016-02-22 15:56:50.000000000","message":"Not sure if it is good to rename an exception.It may be used by someone out of tree. Maybe make AddressAlreadyExists inherit MACAlreadyExists?","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":149,"context_line":"    _msg_fmt \u003d _(\"A node with UUID %(uuid)s already exists.\")"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":""},{"line_number":152,"context_line":"class AddressAlreadyExists(Conflict):"},{"line_number":153,"context_line":"    _msg_fmt \u003d _(\"A port with MAC address or GID %(address)s already exists.\")"},{"line_number":154,"context_line":""},{"line_number":155,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_0c686ab8","line":152,"in_reply_to":"bae84128_d5d2a8ff","updated":"2016-02-23 13:46:27.000000000","message":"Done","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"}],"ironic/common/neutron.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"36506a8a1bb358a036284b1da8c8f183da0c0758","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            client_id_opt \u003d {\u0027opt_name\u0027: \u0027client-id\u0027, \u0027opt_value\u0027: client_id}"},{"line_number":127,"context_line":"            if \u0027extra_dhcp_opts\u0027 not in body[\u0027port\u0027]:"},{"line_number":128,"context_line":"                body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d []"},{"line_number":129,"context_line":"            body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027].append(client_id_opt)"},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            port \u003d client.create_port(body)"},{"line_number":132,"context_line":"        except neutron_exceptions.NeutronClientException as e:"}],"source_content_type":"text/x-python","patch_set":32,"id":"9ad45d7e_2d76b9d8","line":129,"updated":"2016-08-12 09:20:45.000000000","message":"nit: We could avoid that conditional\n\nextra_dhcp_opts \u003d body[\u0027port\u0027].get(\u0027extra_dhcp_opts\u0027, [])\nextra_dhcp_opts.append(client_id_opt)\nbody[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d extra_dhcp_opts","commit_id":"628412dbe881be01826a01ecb9cbb1940faac51e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"bc42a501cec44c7796e85dd1e7ce0b2456ec683b","unresolved":false,"context_lines":[{"line_number":126,"context_line":"            client_id_opt \u003d {\u0027opt_name\u0027: \u0027client-id\u0027, \u0027opt_value\u0027: client_id}"},{"line_number":127,"context_line":"            if \u0027extra_dhcp_opts\u0027 not in body[\u0027port\u0027]:"},{"line_number":128,"context_line":"                body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d []"},{"line_number":129,"context_line":"            body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027].append(client_id_opt)"},{"line_number":130,"context_line":"        try:"},{"line_number":131,"context_line":"            port \u003d client.create_port(body)"},{"line_number":132,"context_line":"        except neutron_exceptions.NeutronClientException as e:"}],"source_content_type":"text/x-python","patch_set":32,"id":"3ac371cc_53aaae71","line":129,"in_reply_to":"9ad45d7e_2d76b9d8","updated":"2016-08-14 06:28:12.000000000","message":"Done","commit_id":"628412dbe881be01826a01ecb9cbb1940faac51e"}],"ironic/common/pxe_utils.py":[{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"489dd90d28a708d05a628917b80d90a35459c05b","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                        ip_address_path)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"def _get_pxe_mac_path(address, delimiter\u003dNone):"},{"line_number":132,"context_line":"    \"\"\"Convert a MAC/GID address into a PXE config file name."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    :param address: A MAC/GID address string in the format xx:xx:xx:xx:xx:xx."}],"source_content_type":"text/x-python","patch_set":9,"id":"5a5ae5dd_1eae9385","line":131,"range":{"start_line":131,"start_character":13,"end_line":131,"end_character":16},"updated":"2016-02-04 09:35:51.000000000","message":"Would it be better to update the function name too so as to be consistent with other update?","commit_id":"2d38a3454de0eb47b508ca7d06ded64e6aaece05"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"cd4cde71c1fdca0bb252d5828440c5a673eb7d3f","unresolved":false,"context_lines":[{"line_number":128,"context_line":"                                        ip_address_path)"},{"line_number":129,"context_line":""},{"line_number":130,"context_line":""},{"line_number":131,"context_line":"def _get_pxe_mac_path(address, delimiter\u003dNone):"},{"line_number":132,"context_line":"    \"\"\"Convert a MAC/GID address into a PXE config file name."},{"line_number":133,"context_line":""},{"line_number":134,"context_line":"    :param address: A MAC/GID address string in the format xx:xx:xx:xx:xx:xx."}],"source_content_type":"text/x-python","patch_set":9,"id":"5a5ae5dd_28cdc884","line":131,"range":{"start_line":131,"start_character":13,"end_line":131,"end_character":16},"in_reply_to":"5a5ae5dd_1eae9385","updated":"2016-02-09 12:57:11.000000000","message":"Done","commit_id":"2d38a3454de0eb47b508ca7d06ded64e6aaece05"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    if utils.is_valid_gid(lowered_address):"},{"line_number":148,"context_line":"        lowered_address \u003d utils.normalize_to_mac(lowered_address, vendor_id)"},{"line_number":149,"context_line":"        address_file_name \u003d lowered_address.replace(\u0027:\u0027, delimiter)"},{"line_number":150,"context_line":"        address_file_name \u003d \u002720-\u0027 + address_file_name"},{"line_number":151,"context_line":"    else:"},{"line_number":152,"context_line":"        if not CONF.pxe.ipxe_enabled:"},{"line_number":153,"context_line":"            address_file_name \u003d \u002701-\u0027 + address_file_name"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_f547ec48","line":150,"updated":"2016-02-22 15:56:50.000000000","message":"Just wondering, is adding \u002720-\u0027 is some convention?","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":147,"context_line":"    if utils.is_valid_gid(lowered_address):"},{"line_number":148,"context_line":"        lowered_address \u003d utils.normalize_to_mac(lowered_address, vendor_id)"},{"line_number":149,"context_line":"        address_file_name \u003d lowered_address.replace(\u0027:\u0027, delimiter)"},{"line_number":150,"context_line":"        address_file_name \u003d \u002720-\u0027 + address_file_name"},{"line_number":151,"context_line":"    else:"},{"line_number":152,"context_line":"        if not CONF.pxe.ipxe_enabled:"},{"line_number":153,"context_line":"            address_file_name \u003d \u002701-\u0027 + address_file_name"}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_4c98abc0","line":150,"in_reply_to":"bae84128_f547ec48","updated":"2016-02-23 13:46:27.000000000","message":"so this should be in the not CONF.pxe.ipxe_enabled \nsection\nThe address-file name is always the \u003chardware type\u003e+address\nbecause so for ethernet is 01 and InfiniBand it is 20\nsee http://git.kernel.org/cgit/boot/syslinux/syslinux.git/tree/doc/pxelinux.txt#n53\nI will fix this and will add comment","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    if delimiter is None:"},{"line_number":142,"context_line":"        delimiter \u003d \u0027-\u0027"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    lowered_address \u003d address.lower()"},{"line_number":145,"context_line":"    address_file_name \u003d lowered_address.replace(\u0027:\u0027, delimiter)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    if not CONF.pxe.ipxe_enabled:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f2ff49a8","line":144,"updated":"2016-02-25 11:48:40.000000000","message":"Addresses stored in DB in normalized form, this is not needed.","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":141,"context_line":"    if delimiter is None:"},{"line_number":142,"context_line":"        delimiter \u003d \u0027-\u0027"},{"line_number":143,"context_line":""},{"line_number":144,"context_line":"    lowered_address \u003d address.lower()"},{"line_number":145,"context_line":"    address_file_name \u003d lowered_address.replace(\u0027:\u0027, delimiter)"},{"line_number":146,"context_line":""},{"line_number":147,"context_line":"    if not CONF.pxe.ipxe_enabled:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_54f9be4c","line":144,"in_reply_to":"bae84128_f2ff49a8","updated":"2016-02-25 12:55:31.000000000","message":"https://github.com/openstack/ironic/blob/master/ironic/common/pxe_utils.py#L14\nand removing it will cause some test to failed so, I think it is better to keep it.","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"26b3413b85664590bb8ac1c8010fd75202ff9556","unresolved":false,"context_lines":[{"line_number":123,"context_line":"                                        ip_address_path)"},{"line_number":124,"context_line":""},{"line_number":125,"context_line":""},{"line_number":126,"context_line":"def _get_pxe_mac_path(mac, delimiter\u003d\u0027-\u0027, client_id\u003dNone):"},{"line_number":127,"context_line":"    \"\"\"Convert a MAC address into a PXE config file name."},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"    :param mac: A MAC address string in the format xx:xx:xx:xx:xx:xx."}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_66bcb906","line":126,"range":{"start_line":126,"start_character":42,"end_line":126,"end_character":56},"updated":"2016-07-26 12:39:32.000000000","message":"needs to be added to docstring.","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"}],"ironic/common/utils.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":173,"context_line":"def is_valid_address(address):"},{"line_number":174,"context_line":"    \"\"\"Verify the format of a address."},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    Check if address is a Valid MAC address which contains six octets, or"},{"line_number":177,"context_line":"    a valid GID which contains 20 octets. Accepts"},{"line_number":178,"context_line":"    colon-separated format only."},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_bea8f1dc","line":176,"updated":"2016-01-07 12:36:33.000000000","message":"typo: \"Valid\" -\u003e \"valid\"","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":173,"context_line":"def is_valid_address(address):"},{"line_number":174,"context_line":"    \"\"\"Verify the format of a address."},{"line_number":175,"context_line":""},{"line_number":176,"context_line":"    Check if address is a Valid MAC address which contains six octets, or"},{"line_number":177,"context_line":"    a valid GID which contains 20 octets. Accepts"},{"line_number":178,"context_line":"    colon-separated format only."},{"line_number":179,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_7f2113b4","line":176,"in_reply_to":"fa69d971_bea8f1dc","updated":"2016-01-07 13:28:44.000000000","message":"Done","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    return port"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"def normalize_to_mac(address):"},{"line_number":756,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":757,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":758,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_1e6b3d87","line":755,"updated":"2016-01-07 12:36:33.000000000","message":"Is it meaningful to convert a GID to MAC format? Does that give us something usable?","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    return port"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"def normalize_to_mac(address):"},{"line_number":756,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":757,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":758,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_91ab9bd6","line":755,"in_reply_to":"fa69d971_1e6b3d87","updated":"2016-01-07 13:28:44.000000000","message":"we need this able to create the neutron port for the dhcp. the MAC it self doesn\u0027t mean anything because we will use the client-id option in dhcp with GID.\nI will add comment for that.\n\nAfter reading all you comment maybe it worth to remove this function and see if we can put 00:00:00:00:00:00 mac in the neutron port.\nI will check that.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"dc0e7798465fc822211db42c4e68ac1590b25e25","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    return port"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"def normalize_to_mac(address):"},{"line_number":756,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":757,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":758,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_85d031f9","line":755,"in_reply_to":"fa69d971_8a78402d","updated":"2016-01-07 14:42:51.000000000","message":"Oh dear - in that case we should definitely worry about what happens when we have two machines with different GIDs that shorten to the same value. I don\u0027t know what to do in that situation :-(","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"ee64430bbdea85013a0b7d5d52bb2416faa0ce59","unresolved":false,"context_lines":[{"line_number":752,"context_line":"    return port"},{"line_number":753,"context_line":""},{"line_number":754,"context_line":""},{"line_number":755,"context_line":"def normalize_to_mac(address):"},{"line_number":756,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":757,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":758,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_8a78402d","line":755,"in_reply_to":"fa69d971_91ab9bd6","updated":"2016-01-07 14:25:10.000000000","message":"looking on the neutron code this kind of change is not easy.\nIt seem that mac has constrains to be uniqe in a network.\nI think I keep this method I will add some comments.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":13719,"name":"Naohiro Tamura","email":"naohirot.openstack@gmail.com","username":"nao"},"change_message_id":"489dd90d28a708d05a628917b80d90a35459c05b","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    :param address: GID or MAC."},{"line_number":687,"context_line":"    :returns: truncated MAC."},{"line_number":688,"context_line":"    \"\"\""},{"line_number":689,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":690,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":691,"context_line":"    return address"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a5ae5dd_4130ace8","line":689,"range":{"start_line":689,"start_character":11,"end_line":689,"end_character":18},"updated":"2016-02-04 09:35:51.000000000","message":"I wondered if it would be better to validate the address if this function is a common utility.\nAnd I figured out that caller validate the address in neutron.py.\nSo I prefer to add docsring that mentions caller has to be validate the address.","commit_id":"2d38a3454de0eb47b508ca7d06ded64e6aaece05"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"cd4cde71c1fdca0bb252d5828440c5a673eb7d3f","unresolved":false,"context_lines":[{"line_number":686,"context_line":"    :param address: GID or MAC."},{"line_number":687,"context_line":"    :returns: truncated MAC."},{"line_number":688,"context_line":"    \"\"\""},{"line_number":689,"context_line":"    if len(address) \u003d\u003d 59:"},{"line_number":690,"context_line":"        return address[36:-14] + address[51:]"},{"line_number":691,"context_line":"    return address"},{"line_number":692,"context_line":""}],"source_content_type":"text/x-python","patch_set":9,"id":"5a5ae5dd_8892bc4a","line":689,"range":{"start_line":689,"start_character":11,"end_line":689,"end_character":18},"in_reply_to":"5a5ae5dd_4130ace8","updated":"2016-02-09 12:57:11.000000000","message":"I added is_valid_gid to validate it the function","commit_id":"2d38a3454de0eb47b508ca7d06ded64e6aaece05"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":65,"context_line":"_INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING \u003d ("},{"line_number":66,"context_line":"    {_MLNX_VENDOR_ID: lambda address: address[36:-14] + address[51:]})"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"MAC_REGEX \u003d re.compile(\u0027[0-9a-f]{2}(:[0-9a-f]{2}){5}$\u0027)"},{"line_number":69,"context_line":"GID_REGEX \u003d re.compile(\u0027[0-9a-f]{2}(:[0-9a-f]{2}){19}$\u0027)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_fa7d1bb2","line":68,"updated":"2016-02-22 15:56:50.000000000","message":"I think ^ can be added to regex too.","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":65,"context_line":"_INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING \u003d ("},{"line_number":66,"context_line":"    {_MLNX_VENDOR_ID: lambda address: address[36:-14] + address[51:]})"},{"line_number":67,"context_line":""},{"line_number":68,"context_line":"MAC_REGEX \u003d re.compile(\u0027[0-9a-f]{2}(:[0-9a-f]{2}){5}$\u0027)"},{"line_number":69,"context_line":"GID_REGEX \u003d re.compile(\u0027[0-9a-f]{2}(:[0-9a-f]{2}){19}$\u0027)"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_41cd0c84","line":68,"in_reply_to":"bae84128_fa7d1bb2","updated":"2016-02-23 13:46:27.000000000","message":"Done","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":733,"context_line":"    of the GID."},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    :param address: GID or MAC."},{"line_number":736,"context_line":"    :returns: truncated MAC."},{"line_number":737,"context_line":"    \"\"\""},{"line_number":738,"context_line":"    if is_valid_gid(address):"},{"line_number":739,"context_line":"        if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_17761f3e","line":736,"updated":"2016-02-25 11:48:40.000000000","message":":raises:","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":733,"context_line":"    of the GID."},{"line_number":734,"context_line":""},{"line_number":735,"context_line":"    :param address: GID or MAC."},{"line_number":736,"context_line":"    :returns: truncated MAC."},{"line_number":737,"context_line":"    \"\"\""},{"line_number":738,"context_line":"    if is_valid_gid(address):"},{"line_number":739,"context_line":"        if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_5748a05b","line":736,"in_reply_to":"bae84128_17761f3e","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":736,"context_line":"    :returns: truncated MAC."},{"line_number":737,"context_line":"    \"\"\""},{"line_number":738,"context_line":"    if is_valid_gid(address):"},{"line_number":739,"context_line":"        if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":740,"context_line":"            raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":741,"context_line":"        return _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING[vendor_id](address)"},{"line_number":742,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_572a67e8","line":739,"updated":"2016-02-25 11:48:40.000000000","message":".. not in_INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING:","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":736,"context_line":"    :returns: truncated MAC."},{"line_number":737,"context_line":"    \"\"\""},{"line_number":738,"context_line":"    if is_valid_gid(address):"},{"line_number":739,"context_line":"        if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":740,"context_line":"            raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":741,"context_line":"        return _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING[vendor_id](address)"},{"line_number":742,"context_line":"    return address"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_d7a950e1","line":739,"in_reply_to":"bae84128_572a67e8","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":746,"context_line":"    \"\"\"Generate client id for GID"},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"    :param gid: InfiniBand GID."},{"line_number":749,"context_line":"    :returns: client id."},{"line_number":750,"context_line":"    \"\"\""},{"line_number":751,"context_line":"    if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":752,"context_line":"        raise exception.UnknownInfiniBandVendor(vendor_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_37936351","line":749,"updated":"2016-02-25 11:48:40.000000000","message":":raises:","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":746,"context_line":"    \"\"\"Generate client id for GID"},{"line_number":747,"context_line":""},{"line_number":748,"context_line":"    :param gid: InfiniBand GID."},{"line_number":749,"context_line":"    :returns: client id."},{"line_number":750,"context_line":"    \"\"\""},{"line_number":751,"context_line":"    if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":752,"context_line":"        raise exception.UnknownInfiniBandVendor(vendor_id)"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_b773ecb3","line":749,"in_reply_to":"bae84128_37936351","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":738,"context_line":"    \"\"\""},{"line_number":739,"context_line":"    if is_valid_gid(address):"},{"line_number":740,"context_line":"        if vendor_id not in _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING:"},{"line_number":741,"context_line":"            raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":742,"context_line":"        return _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING[vendor_id](address)"},{"line_number":743,"context_line":"    return address"},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_636c069d","line":741,"updated":"2016-02-25 13:46:46.000000000","message":"This should be raise exception.UnknownInfiniBandVendor(vendor_id\u003dvendor_id), otherwise vendor_id will overwrite the whole message.","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":738,"context_line":"    \"\"\""},{"line_number":739,"context_line":"    if is_valid_gid(address):"},{"line_number":740,"context_line":"        if vendor_id not in _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING:"},{"line_number":741,"context_line":"            raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":742,"context_line":"        return _INFINIBAND_VENDOR_MAC_TRANSLATION_MAPPING[vendor_id](address)"},{"line_number":743,"context_line":"    return address"},{"line_number":744,"context_line":""}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_95b5fdd1","line":741,"in_reply_to":"bae84128_636c069d","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":751,"context_line":"    :raise: UnknownInfiniBandVendor if vendor_id is None or Unknown."},{"line_number":752,"context_line":"    \"\"\""},{"line_number":753,"context_line":"    if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":754,"context_line":"        raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":755,"context_line":"    return _INFINIBAND_CLIENT_ID_VENDOR_MAPPING[vendor_id] + gid[36:]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_4369028b","line":754,"updated":"2016-02-25 13:46:46.000000000","message":"ditto","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":751,"context_line":"    :raise: UnknownInfiniBandVendor if vendor_id is None or Unknown."},{"line_number":752,"context_line":"    \"\"\""},{"line_number":753,"context_line":"    if vendor_id not in _INFINIBAND_CLIENT_ID_VENDOR_MAPPING:"},{"line_number":754,"context_line":"        raise exception.UnknownInfiniBandVendor(vendor_id)"},{"line_number":755,"context_line":"    return _INFINIBAND_CLIENT_ID_VENDOR_MAPPING[vendor_id] + gid[36:]"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_75baf9c1","line":754,"in_reply_to":"bae84128_4369028b","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"}],"ironic/conductor/manager.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":1752,"context_line":"                if vif:"},{"line_number":1753,"context_line":"                    api \u003d dhcp_factory.DHCPFactory()"},{"line_number":1754,"context_line":"                    api.provider.update_port_address(vif, port_obj.address,"},{"line_number":1755,"context_line":"                                                     vendor_id,"},{"line_number":1756,"context_line":"                                                     token\u003dcontext.auth_token)"},{"line_number":1757,"context_line":"                # Log warning if there is no vif_port_id and an instance"},{"line_number":1758,"context_line":"                # is associated with the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_71b9742e","line":1755,"updated":"2016-02-25 11:48:40.000000000","message":"1) There is TypeError because because you pass \"token\" as positional and kw arg in the same time https://review.openstack.org/#/c/264263/15/ironic/dhcp/base.py 2) This new parameter will broke all out of tree dhcp providers. Maybe pass only if it\u0027s not None, if this parameter is really needed (see my comment on dhcp base).","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":1752,"context_line":"                if vif:"},{"line_number":1753,"context_line":"                    api \u003d dhcp_factory.DHCPFactory()"},{"line_number":1754,"context_line":"                    api.provider.update_port_address(vif, port_obj.address,"},{"line_number":1755,"context_line":"                                                     vendor_id,"},{"line_number":1756,"context_line":"                                                     token\u003dcontext.auth_token)"},{"line_number":1757,"context_line":"                # Log warning if there is no vif_port_id and an instance"},{"line_number":1758,"context_line":"                # is associated with the node."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f7b3b408","line":1755,"in_reply_to":"bae84128_71b9742e","updated":"2016-02-25 12:55:31.000000000","message":"The other option as I see it is to pass the port_obj instead of mac, but this still changes the api.\nI don\u0027t see anyother why I can get the vendor_id from just the mac and the vif uuid. \nDo you have any suggestion?","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"26b3413b85664590bb8ac1c8010fd75202ff9556","unresolved":false,"context_lines":[{"line_number":1658,"context_line":""},{"line_number":1659,"context_line":"            if \u0027address\u0027 in port_obj.obj_what_changed():"},{"line_number":1660,"context_line":"                vif \u003d port_obj.extra.get(\u0027vif_port_id\u0027)"},{"line_number":1661,"context_line":"                client_id \u003d port_obj.extra.get(\u0027client_id\u0027)"},{"line_number":1662,"context_line":"                if vif:"},{"line_number":1663,"context_line":"                    api \u003d dhcp_factory.DHCPFactory()"},{"line_number":1664,"context_line":"                    api.provider.update_port_address(vif, port_obj.address,"}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_e6238956","line":1661,"updated":"2016-07-26 12:39:32.000000000","message":"client-id here? Also meaning that some unittest is missing :)","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"36506a8a1bb358a036284b1da8c8f183da0c0758","unresolved":false,"context_lines":[{"line_number":1701,"context_line":"                    vif \u003d port_obj.extra.get(\u0027vif_port_id\u0027)"},{"line_number":1702,"context_line":"                    # DHCP Option with opt_value\u003dNone will remove it"},{"line_number":1703,"context_line":"                    # from the neutron port"},{"line_number":1704,"context_line":"                    if vif:"},{"line_number":1705,"context_line":"                        api \u003d dhcp_factory.DHCPFactory()"},{"line_number":1706,"context_line":"                        client_id_opt \u003d {\u0027opt_name\u0027: \u0027client-id\u0027,"},{"line_number":1707,"context_line":"                                         \u0027opt_value\u0027: updated_client_id}"}],"source_content_type":"text/x-python","patch_set":32,"id":"9ad45d7e_2d0b592d","line":1704,"range":{"start_line":1704,"start_character":20,"end_line":1704,"end_character":27},"updated":"2016-08-12 09:20:45.000000000","message":"if vif is not None:\n\nCould the id be 0 (zero)* ? If so it won\u0027t pass this conditional.\n\n* I don\u0027t think so, but worth asking","commit_id":"628412dbe881be01826a01ecb9cbb1940faac51e"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"bc42a501cec44c7796e85dd1e7ce0b2456ec683b","unresolved":false,"context_lines":[{"line_number":1701,"context_line":"                    vif \u003d port_obj.extra.get(\u0027vif_port_id\u0027)"},{"line_number":1702,"context_line":"                    # DHCP Option with opt_value\u003dNone will remove it"},{"line_number":1703,"context_line":"                    # from the neutron port"},{"line_number":1704,"context_line":"                    if vif:"},{"line_number":1705,"context_line":"                        api \u003d dhcp_factory.DHCPFactory()"},{"line_number":1706,"context_line":"                        client_id_opt \u003d {\u0027opt_name\u0027: \u0027client-id\u0027,"},{"line_number":1707,"context_line":"                                         \u0027opt_value\u0027: updated_client_id}"}],"source_content_type":"text/x-python","patch_set":32,"id":"3ac371cc_b3dcc219","line":1704,"range":{"start_line":1704,"start_character":20,"end_line":1704,"end_character":27},"in_reply_to":"9ad45d7e_2d0b592d","updated":"2016-08-14 06:28:12.000000000","message":"No and this is the same logic for if \u0027address\u0027 \n\nsee line 1681-1694","commit_id":"628412dbe881be01826a01ecb9cbb1940faac51e"}],"ironic/db/sqlalchemy/alembic/versions/e2c71d4729d5_increase_address_length.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def downgrade():"},{"line_number":36,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":37,"context_line":"                    existing_type\u003dsa.String(length\u003d60),"},{"line_number":38,"context_line":"                    type_\u003dsa.String(length\u003d18))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_995507fc","line":36,"updated":"2016-01-07 12:36:33.000000000","message":"What happens to entries that contain GIDs? Will they be truncated to their first 18 characters?","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def downgrade():"},{"line_number":36,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":37,"context_line":"                    existing_type\u003dsa.String(length\u003d60),"},{"line_number":38,"context_line":"                    type_\u003dsa.String(length\u003d18))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_f1ce97b6","line":36,"in_reply_to":"fa69d971_995507fc","updated":"2016-01-07 13:28:44.000000000","message":"I guess so,\nI am not sure why ironic support downgrade. I know that neutron remove that support.\nIs there any other option?","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"e4d210e9b5d15b79ef42c1a9add7b23bbd0bf3c9","unresolved":false,"context_lines":[{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def downgrade():"},{"line_number":36,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":37,"context_line":"                    existing_type\u003dsa.String(length\u003d60),"},{"line_number":38,"context_line":"                    type_\u003dsa.String(length\u003d18))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_b4248d60","line":36,"in_reply_to":"fa69d971_f1ce97b6","updated":"2016-01-07 13:36:06.000000000","message":"Remove entries that don\u0027t match the MAC format, possibly. I don\u0027t know how likely people are to do downgrades; it might not be worth caring about.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":2889,"name":"Aeva Black","email":"aeva.online@gmail.com","username":"tenbrae"},"change_message_id":"b92d42a136870cefc1a8668099c3a2ba426f7378","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                    type_\u003dsa.String(length\u003d60))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def downgrade():"},{"line_number":36,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":37,"context_line":"                    existing_type\u003dsa.String(length\u003d60),"},{"line_number":38,"context_line":"                    type_\u003dsa.String(length\u003d18))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_e7ea4aac","line":35,"updated":"2016-01-07 17:41:47.000000000","message":"downgrade is no longer supported - please remove this","commit_id":"4004cef841250e9d3191d416ac0e6ec1aeef6c8d"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"821d5f9f7fa5b164215610722dbc226a6592ed0c","unresolved":false,"context_lines":[{"line_number":32,"context_line":"                    type_\u003dsa.String(length\u003d60))"},{"line_number":33,"context_line":""},{"line_number":34,"context_line":""},{"line_number":35,"context_line":"def downgrade():"},{"line_number":36,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":37,"context_line":"                    existing_type\u003dsa.String(length\u003d60),"},{"line_number":38,"context_line":"                    type_\u003dsa.String(length\u003d18))"}],"source_content_type":"text/x-python","patch_set":4,"id":"fa69d971_8b89a228","line":35,"in_reply_to":"fa69d971_e7ea4aac","updated":"2016-01-10 11:33:26.000000000","message":"Done","commit_id":"4004cef841250e9d3191d416ac0e6ec1aeef6c8d"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":26,"context_line":"import sqlalchemy as sa"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade():"},{"line_number":30,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":31,"context_line":"                    existing_type\u003dsa.String(length\u003d18),"},{"line_number":32,"context_line":"                    type_\u003dsa.String(length\u003d60))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_b2502160","line":29,"updated":"2016-02-25 11:48:40.000000000","message":"Please add test for this migration to test_migrations.","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":26,"context_line":"import sqlalchemy as sa"},{"line_number":27,"context_line":""},{"line_number":28,"context_line":""},{"line_number":29,"context_line":"def upgrade():"},{"line_number":30,"context_line":"    op.alter_column(\u0027ports\u0027, \u0027address\u0027,"},{"line_number":31,"context_line":"                    existing_type\u003dsa.String(length\u003d18),"},{"line_number":32,"context_line":"                    type_\u003dsa.String(length\u003d60))"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_82e148d3","line":29,"in_reply_to":"bae84128_b2502160","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"}],"ironic/dhcp/base.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"},{"line_number":51,"context_line":"    def update_port_address("},{"line_number":52,"context_line":"            self, port_id, address, vendor_id\u003dNone, token\u003dNone):"},{"line_number":53,"context_line":"        \"\"\"Update a port\u0027s MAC address."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_75b8fce5","line":52,"updated":"2016-02-22 15:56:50.000000000","message":"Could you add it to the end of parameters, just in case if someone passes positional arguments to this function.","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"},{"line_number":51,"context_line":"    def update_port_address("},{"line_number":52,"context_line":"            self, port_id, address, vendor_id\u003dNone, token\u003dNone):"},{"line_number":53,"context_line":"        \"\"\"Update a port\u0027s MAC address."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_411fcc07","line":52,"in_reply_to":"bae84128_75b8fce5","updated":"2016-02-23 13:46:27.000000000","message":"Done","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"},{"line_number":51,"context_line":"    def update_port_address("},{"line_number":52,"context_line":"            self, port_id, address, token\u003dNone, vendor_id\u003dNone,):"},{"line_number":53,"context_line":"        \"\"\"Update a port\u0027s MAC address."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_6e2075f8","line":52,"updated":"2016-02-25 11:48:40.000000000","message":"It\u0027s really needed to add new parameter to public dhcp API? Can we hide this magic inside implementation method?","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":49,"context_line":""},{"line_number":50,"context_line":"    @abc.abstractmethod"},{"line_number":51,"context_line":"    def update_port_address("},{"line_number":52,"context_line":"            self, port_id, address, token\u003dNone, vendor_id\u003dNone,):"},{"line_number":53,"context_line":"        \"\"\"Update a port\u0027s MAC address."},{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_b72acce5","line":52,"in_reply_to":"bae84128_6e2075f8","updated":"2016-02-25 12:55:31.000000000","message":"I think that instead of passing the port_id and address \nthe api should be change to port_object meaning\nupdate_port_address(port_obj, token)\nthen any additional change will not effect the api in the long run.","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."},{"line_number":56,"context_line":"        :param address: new MAC address."},{"line_number":57,"context_line":"        :param token: An optional authenticaiton token."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        :raises: FailedToUpdateMacOnPort"},{"line_number":60,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_e382d6c7","line":57,"updated":"2016-02-25 13:46:46.000000000","message":"nit - should be added to docstring.","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":54,"context_line":""},{"line_number":55,"context_line":"        :param port_id: port id."},{"line_number":56,"context_line":"        :param address: new MAC address."},{"line_number":57,"context_line":"        :param token: An optional authenticaiton token."},{"line_number":58,"context_line":""},{"line_number":59,"context_line":"        :raises: FailedToUpdateMacOnPort"},{"line_number":60,"context_line":"        \"\"\""}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_385228de","line":57,"in_reply_to":"bae84128_e382d6c7","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"}],"ironic/dhcp/neutron.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        ports \u003d {}"},{"line_number":311,"context_line":"        for ironic_port in task.ports:"},{"line_number":312,"context_line":"            mac \u003d utils.normalize_to_mac(ironic_port.address)"},{"line_number":313,"context_line":"            body[\u0027port\u0027][\u0027mac_address\u0027] \u003d mac"},{"line_number":314,"context_line":"            try:"},{"line_number":315,"context_line":"                port \u003d neutron_client.create_port(body)"},{"line_number":316,"context_line":"            except neutron_client_exc.ConnectionFailed as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_4447a24b","line":313,"updated":"2016-01-07 12:36:33.000000000","message":"Ah, so we need a MAC-formatted address to return to clients who expect to find one? I\u0027m not sure it\u0027s helpful to lie to them, though. It might be better to return 00:00:00:00:00:00 in line with RFC 4390 section 2.1. What do they use the mac_address field for? And does it matter if there are collisions?","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":310,"context_line":"        ports \u003d {}"},{"line_number":311,"context_line":"        for ironic_port in task.ports:"},{"line_number":312,"context_line":"            mac \u003d utils.normalize_to_mac(ironic_port.address)"},{"line_number":313,"context_line":"            body[\u0027port\u0027][\u0027mac_address\u0027] \u003d mac"},{"line_number":314,"context_line":"            try:"},{"line_number":315,"context_line":"                port \u003d neutron_client.create_port(body)"},{"line_number":316,"context_line":"            except neutron_client_exc.ConnectionFailed as e:"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_d1aef397","line":313,"in_reply_to":"fa69d971_4447a24b","updated":"2016-01-07 13:28:44.000000000","message":"I will check if neutron support putting 00:00:00:00:00:00 mac\nor I can resolve it in neutron","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"bde21f3741bf1be9d65025dded33e0d0284f536a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        # go over the port vifs"},{"line_number":194,"context_line":"        port_vif_list \u003d vifs[\u0027ports\u0027].values()"},{"line_number":195,"context_line":"        for port in task.ports:"},{"line_number":196,"context_line":"            port_vif \u003d vifs[\u0027ports\u0027][port.uuid]"},{"line_number":197,"context_line":"            if port_vif in port_vif_list:"},{"line_number":198,"context_line":"                try:"},{"line_number":199,"context_line":"                    if utils.is_valid_gid(port.address):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_ce80a149","line":196,"updated":"2016-02-25 11:48:40.000000000","message":"KeyError is possible here because port might not have vif. This loop should look like\n\n for port in task.ports:\n      port_vif \u003d vifs[\u0027ports\u0027].get(port.uuid)\n      if port_vif:\n          try:\n              ...\n\nAnd l194 is not needed.","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"41788b4aceae038d8ca433402a3bc3d438dda4a4","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        # go over the port vifs"},{"line_number":194,"context_line":"        port_vif_list \u003d vifs[\u0027ports\u0027].values()"},{"line_number":195,"context_line":"        for port in task.ports:"},{"line_number":196,"context_line":"            port_vif \u003d vifs[\u0027ports\u0027][port.uuid]"},{"line_number":197,"context_line":"            if port_vif in port_vif_list:"},{"line_number":198,"context_line":"                try:"},{"line_number":199,"context_line":"                    if utils.is_valid_gid(port.address):"}],"source_content_type":"text/x-python","patch_set":15,"id":"bae84128_f7d0d4cb","line":196,"in_reply_to":"bae84128_ce80a149","updated":"2016-02-25 12:55:31.000000000","message":"Done","commit_id":"e2955751c734d81a24bfc6b977ac72464365623c"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param port_id: Neutron port id."},{"line_number":132,"context_line":"        :param address: new MAC address."},{"line_number":133,"context_line":"        :param token: optional auth token."},{"line_number":134,"context_line":"        :raises: FailedToUpdateMacOnPort"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        if utils.is_valid_gid(address):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_a35f2e74","line":133,"updated":"2016-02-25 13:46:46.000000000","message":"ditto","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":130,"context_line":""},{"line_number":131,"context_line":"        :param port_id: Neutron port id."},{"line_number":132,"context_line":"        :param address: new MAC address."},{"line_number":133,"context_line":"        :param token: optional auth token."},{"line_number":134,"context_line":"        :raises: FailedToUpdateMacOnPort"},{"line_number":135,"context_line":"        \"\"\""},{"line_number":136,"context_line":"        if utils.is_valid_gid(address):"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_780950dd","line":133,"in_reply_to":"bae84128_a35f2e74","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":195,"context_line":"            port_vif \u003d vifs[\u0027ports\u0027].get(port.uuid)"},{"line_number":196,"context_line":"            if port_vif:"},{"line_number":197,"context_line":"                try:"},{"line_number":198,"context_line":"                    if utils.is_valid_gid(port.address):"},{"line_number":199,"context_line":"                        vendor_id \u003d port.extra.get(\u0027vedor_id\u0027)"},{"line_number":200,"context_line":"                        client_id \u003d utils.generate_client_id("},{"line_number":201,"context_line":"                            port.address, vendor_id)"}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_c31072ab","line":198,"updated":"2016-02-25 13:46:46.000000000","message":"This chunk of code and the one on L136 are almost the same. might be worth refactoring.","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"26b3413b85664590bb8ac1c8010fd75202ff9556","unresolved":false,"context_lines":[{"line_number":134,"context_line":"                failures.append(vif)"},{"line_number":135,"context_line":"        # go over the port vifs"},{"line_number":136,"context_line":"        for port in task.ports:"},{"line_number":137,"context_line":"            port_vif \u003d vifs[\u0027ports\u0027].get(port.uuid)"},{"line_number":138,"context_line":"            if port_vif:"},{"line_number":139,"context_line":"                try:"},{"line_number":140,"context_line":"                    client_id \u003d port.extra.get(\u0027client-id\u0027)"}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_e60f0937","line":137,"updated":"2016-07-26 12:39:32.000000000","message":"Why not just go over vifs[\u0027ports\u0027] from the beginning?","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"},{"author":{"_account_id":6637,"name":"Sam Betts","email":"sam@code-smash.net","username":"sambetts"},"change_message_id":"c2be48193c5588ba214d21b9964b6703984dc6a8","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    client_id \u003d port.extra.get(\u0027client-id\u0027)"},{"line_number":141,"context_line":"                    if client_id:"},{"line_number":142,"context_line":"                        options.append({\u0027opt_name\u0027: \u0027client-id\u0027,"},{"line_number":143,"context_line":"                                        \u0027opt_value\u0027: client_id})"},{"line_number":144,"context_line":"                    self.update_port_dhcp_opts(port_vif, options,"},{"line_number":145,"context_line":"                                               token\u003dtask.context.auth_token)"},{"line_number":146,"context_line":"                except exception.FailedToUpdateDHCPOptOnPort:"}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_8daae617","line":143,"updated":"2016-07-25 14:19:28.000000000","message":"I\u0027m not sure we should be adding/changing any of the options in this function, this function is purely for setting a set of options passed into it onto a neutron port. I wonder if it makes more sense for it to live in the function dhcp_options_for_instance here https://review.openstack.org/#/c/264263/26/ironic/common/pxe_utils.py@288 builds the dictionary, and I think this logic should probably live in there.","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"93872442ff434b4bb64fc4e04474a06f6ef5cf4f","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    client_id \u003d port.extra.get(\u0027client-id\u0027)"},{"line_number":141,"context_line":"                    if client_id:"},{"line_number":142,"context_line":"                        options.append({\u0027opt_name\u0027: \u0027client-id\u0027,"},{"line_number":143,"context_line":"                                        \u0027opt_value\u0027: client_id})"},{"line_number":144,"context_line":"                    self.update_port_dhcp_opts(port_vif, options,"},{"line_number":145,"context_line":"                                               token\u003dtask.context.auth_token)"},{"line_number":146,"context_line":"                except exception.FailedToUpdateDHCPOptOnPort:"}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_dc264d67","line":143,"in_reply_to":"dada55a8_8daae617","updated":"2016-07-25 15:36:15.000000000","message":"So the problem with adding it to the pxe_utils is that it returns the general  dhcp options for instance and the client-id option is per port. I can\u0027t find a way in dhcp_options_for_instance to know that port\u0027s client-id I need to add","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"236e1b67944d75a5090a322e2dc1311fa543331c","unresolved":false,"context_lines":[{"line_number":140,"context_line":"                    client_id \u003d port.extra.get(\u0027client-id\u0027)"},{"line_number":141,"context_line":"                    if client_id:"},{"line_number":142,"context_line":"                        options.append({\u0027opt_name\u0027: \u0027client-id\u0027,"},{"line_number":143,"context_line":"                                        \u0027opt_value\u0027: client_id})"},{"line_number":144,"context_line":"                    self.update_port_dhcp_opts(port_vif, options,"},{"line_number":145,"context_line":"                                               token\u003dtask.context.auth_token)"},{"line_number":146,"context_line":"                except exception.FailedToUpdateDHCPOptOnPort:"}],"source_content_type":"text/x-python","patch_set":26,"id":"dada55a8_9cee9589","line":143,"in_reply_to":"dada55a8_dc264d67","updated":"2016-07-25 15:43:19.000000000","message":"I mean I don\u0027t know in the dhcp_options_for_instance what will be the port we will pxe boot from so I don\u0027t know what client-id if any to add","commit_id":"1b122ccb4b980276e2bbfb184519e6bbf9ccedde"}],"ironic/drivers/modules/agent_base_vendor.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        for interface in interfaces:"},{"line_number":487,"context_line":"            try:"},{"line_number":488,"context_line":"                mac_addresses.append(utils.validate_and_normalize_address("},{"line_number":489,"context_line":"                    interface.get(\u0027mac_address\u0027)))"},{"line_number":490,"context_line":"            except exception.InvalidAddess:"},{"line_number":491,"context_line":"                LOG.warning(_LW(\u0027Malformed MAC or GID: %s\u0027), interface.get("},{"line_number":492,"context_line":"                    \u0027mac_address\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_24bdce02","line":489,"updated":"2016-01-07 12:36:33.000000000","message":"Can the return value of interface.get(\u0027mac_address\u0027) be GID-formatted?","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":486,"context_line":"        for interface in interfaces:"},{"line_number":487,"context_line":"            try:"},{"line_number":488,"context_line":"                mac_addresses.append(utils.validate_and_normalize_address("},{"line_number":489,"context_line":"                    interface.get(\u0027mac_address\u0027)))"},{"line_number":490,"context_line":"            except exception.InvalidAddess:"},{"line_number":491,"context_line":"                LOG.warning(_LW(\u0027Malformed MAC or GID: %s\u0027), interface.get("},{"line_number":492,"context_line":"                    \u0027mac_address\u0027))"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_71daa7eb","line":489,"in_reply_to":"fa69d971_24bdce02","updated":"2016-01-07 13:28:44.000000000","message":"yes,\nthe gid is taken from the some location of the mac address /sys/class/net/\u003cinterface_name\u003e/address\nThe ironic-python-agent use this location to grab the mac so it will also get the ib interfaces. you just need to install ipoib driver so that the agent can talk to the ironic-inspector.\n\nwe have POC ironic-python-agent and the ironic-inspector to inspect Mellanox infinband NIC.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"}],"ironic/drivers/modules/ilo/inspect.py":[{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"73ef2f5fb00bcedc46ef9b9b2fbb934f0c5579cb","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            sql_dbapi.create_port(port_dict)"},{"line_number":56,"context_line":"            LOG.info(_LI(\"Port created for MAC address %(address)s for node \""},{"line_number":57,"context_line":"                         \"%(node)s\"), {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"},{"line_number":58,"context_line":"        except exception.AddressAlreadyExists:"},{"line_number":59,"context_line":"            LOG.warning(_LW(\"Port already exists for MAC address %(address)s \""},{"line_number":60,"context_line":"                            \"for node %(node)s\"),"},{"line_number":61,"context_line":"                        {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_e4ec9694","line":58,"updated":"2016-01-07 12:36:33.000000000","message":"These might be truncated GIDs, right? If so, I think you\u0027re going to get false errors due to collisions in the truncated values.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":18893,"name":"Miles Gould","email":"mgould@redhat.com","username":"pozorvlak"},"change_message_id":"e4d210e9b5d15b79ef42c1a9add7b23bbd0bf3c9","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            sql_dbapi.create_port(port_dict)"},{"line_number":56,"context_line":"            LOG.info(_LI(\"Port created for MAC address %(address)s for node \""},{"line_number":57,"context_line":"                         \"%(node)s\"), {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"},{"line_number":58,"context_line":"        except exception.AddressAlreadyExists:"},{"line_number":59,"context_line":"            LOG.warning(_LW(\"Port already exists for MAC address %(address)s \""},{"line_number":60,"context_line":"                            \"for node %(node)s\"),"},{"line_number":61,"context_line":"                        {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_34f09dc9","line":58,"in_reply_to":"fa69d971_1199eb1f","updated":"2016-01-07 13:36:06.000000000","message":"OK, makes sense!","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"29c94333856238516b7564862ab627321a8ed51e","unresolved":false,"context_lines":[{"line_number":55,"context_line":"            sql_dbapi.create_port(port_dict)"},{"line_number":56,"context_line":"            LOG.info(_LI(\"Port created for MAC address %(address)s for node \""},{"line_number":57,"context_line":"                         \"%(node)s\"), {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"},{"line_number":58,"context_line":"        except exception.AddressAlreadyExists:"},{"line_number":59,"context_line":"            LOG.warning(_LW(\"Port already exists for MAC address %(address)s \""},{"line_number":60,"context_line":"                            \"for node %(node)s\"),"},{"line_number":61,"context_line":"                        {\u0027address\u0027: mac, \u0027node\u0027: node.uuid})"}],"source_content_type":"text/x-python","patch_set":2,"id":"fa69d971_1199eb1f","line":58,"in_reply_to":"fa69d971_e4ec9694","updated":"2016-01-07 13:28:44.000000000","message":"no I increased the db to 60 Chars to support GID.\nI only truncate it to create the neutron port.","commit_id":"e82456bcac6463a6cf7c7306bbbc0a7c30baccc5"}],"ironic/drivers/modules/network/neutron.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ee8708701f212bf65df4b0ab31ee0054bf7bf85f","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                }"},{"line_number":190,"context_line":"            }"},{"line_number":191,"context_line":"            if client_id_opt:"},{"line_number":192,"context_line":"                if \u0027extra_dhcp_opts\u0027 not in body[\u0027port\u0027]:"},{"line_number":193,"context_line":"                    body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d []"},{"line_number":194,"context_line":"                body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027].append(client_id_opt)"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"bacf61ea_d46c04d2","line":192,"updated":"2016-08-05 15:05:20.000000000","message":"Why do you check this? You know it\u0027s not there, body is defined on L179","commit_id":"bafe38c9c9427ddcfe3c1ebade188775b4004bdf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"7175dd461684e49e5cf747cac050b716978564cb","unresolved":false,"context_lines":[{"line_number":189,"context_line":"                }"},{"line_number":190,"context_line":"            }"},{"line_number":191,"context_line":"            if client_id_opt:"},{"line_number":192,"context_line":"                if \u0027extra_dhcp_opts\u0027 not in body[\u0027port\u0027]:"},{"line_number":193,"context_line":"                    body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d []"},{"line_number":194,"context_line":"                body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027].append(client_id_opt)"},{"line_number":195,"context_line":""}],"source_content_type":"text/x-python","patch_set":29,"id":"bacf61ea_6f9aa515","line":192,"in_reply_to":"bacf61ea_d46c04d2","updated":"2016-08-05 15:29:41.000000000","message":"Done","commit_id":"bafe38c9c9427ddcfe3c1ebade188775b4004bdf"}],"ironic/objects/port.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"41a6048916173f6ec3ec6cdc0f1afc1f69be6ca6","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    # Version 1.4: Add list_by_node_id()"},{"line_number":35,"context_line":"    # Version 1.5: Add list_by_portgroup_id() and new fields"},{"line_number":36,"context_line":"    #              local_link_connection, portgroup_id and pxe_enabled"},{"line_number":37,"context_line":"    # Version 1.6: Add get_address_type() and"},{"line_number":38,"context_line":"    #              update address to be ClientAddressField"},{"line_number":39,"context_line":"    VERSION \u003d \u00271.6\u0027"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_55b7b8d7","line":37,"updated":"2016-02-22 15:56:50.000000000","message":"Not sure what do you mean here with get_address_type","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"303a64c1878321e7b67639a7bb185864d00790fe","unresolved":false,"context_lines":[{"line_number":34,"context_line":"    # Version 1.4: Add list_by_node_id()"},{"line_number":35,"context_line":"    # Version 1.5: Add list_by_portgroup_id() and new fields"},{"line_number":36,"context_line":"    #              local_link_connection, portgroup_id and pxe_enabled"},{"line_number":37,"context_line":"    # Version 1.6: Add get_address_type() and"},{"line_number":38,"context_line":"    #              update address to be ClientAddressField"},{"line_number":39,"context_line":"    VERSION \u003d \u00271.6\u0027"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-python","patch_set":14,"id":"bae84128_a16a187f","line":37,"in_reply_to":"bae84128_55b7b8d7","updated":"2016-02-23 13:46:27.000000000","message":"Done","commit_id":"e0b39279ecab50864dc4df5f20b5754d70ca9cba"}],"ironic/tests/unit/conductor/test_manager.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"54442adc4f90d020fb819d7a76e8428c4260056c","unresolved":false,"context_lines":[{"line_number":2828,"context_line":"                                          node_id\u003dnode.id,"},{"line_number":2829,"context_line":"                                          extra\u003d{\u0027vif_port_id\u0027: \u0027fake-id\u0027,"},{"line_number":2830,"context_line":"                                                 \u0027client-id\u0027: \u0027fake1\u0027})"},{"line_number":2831,"context_line":"        expected_extra \u003d {\u0027vif_port_id\u0027: \u0027new_ake-id\u0027, \u0027client-id\u0027: \u0027fake1\u0027}"},{"line_number":2832,"context_line":"        port.extra \u003d expected_extra"},{"line_number":2833,"context_line":"        res \u003d self.service.update_port(self.context, port)"},{"line_number":2834,"context_line":"        self.assertEqual(expected_extra, res.extra)"}],"source_content_type":"text/x-python","patch_set":33,"id":"3ac371cc_aab2dd91","line":2831,"range":{"start_line":2831,"start_character":26,"end_line":2831,"end_character":75},"updated":"2016-08-17 16:36:49.000000000","message":"did you mean to show that if client-id is not changed, dhcp provider is not called? I\u0027d set some foo field here to make it clearer.","commit_id":"8f251134e85e07880725413b461c4e6ab9f67a31"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"54442adc4f90d020fb819d7a76e8428c4260056c","unresolved":false,"context_lines":[{"line_number":2854,"context_line":"        port.refresh()"},{"line_number":2855,"context_line":"        self.assertEqual(expected_extra, port.extra)"},{"line_number":2856,"context_line":""},{"line_number":2857,"context_line":"    @mock.patch(\u0027ironic.dhcp.neutron.NeutronDHCPApi.update_port_dhcp_opts\u0027)"},{"line_number":2858,"context_line":"    def test_update_port_client_id_no_vif_id(self, dhcp_update_mock):"},{"line_number":2859,"context_line":"        node \u003d obj_utils.create_test_node(self.context, driver\u003d\u0027fake\u0027)"},{"line_number":2860,"context_line":"        port \u003d obj_utils.create_test_port(self.context, node_id\u003dnode.id)"}],"source_content_type":"text/x-python","patch_set":33,"id":"3ac371cc_ea04d518","line":2857,"updated":"2016-08-17 16:36:49.000000000","message":"Might be good to assert that log warning was called.","commit_id":"8f251134e85e07880725413b461c4e6ab9f67a31"}],"ironic/tests/unit/dhcp/test_neutron.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def test_update_dhcp_some_failures(self, mock_gnvi, mock_updo):"},{"line_number":225,"context_line":"        # confirm update is called twice, one fails, but no exception raised"},{"line_number":226,"context_line":"        port2 \u003d object_utils.create_test_port("},{"line_number":227,"context_line":"            self.context, node_id\u003dself.node.id, id\u003d3,"},{"line_number":228,"context_line":"            uuid\u003d\u0027d04e451e-f7f8-4904-9f7e-5425e327e346\u0027,"},{"line_number":229,"context_line":"            address\u003d\u002752:54:00:cf:2d:33\u0027)"},{"line_number":230,"context_line":"        mock_gnvi.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_3548715b","line":227,"updated":"2016-02-25 13:46:46.000000000","message":"It\u0027s better to avoid setting id, even in tests.","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":224,"context_line":"    def test_update_dhcp_some_failures(self, mock_gnvi, mock_updo):"},{"line_number":225,"context_line":"        # confirm update is called twice, one fails, but no exception raised"},{"line_number":226,"context_line":"        port2 \u003d object_utils.create_test_port("},{"line_number":227,"context_line":"            self.context, node_id\u003dself.node.id, id\u003d3,"},{"line_number":228,"context_line":"            uuid\u003d\u0027d04e451e-f7f8-4904-9f7e-5425e327e346\u0027,"},{"line_number":229,"context_line":"            address\u003d\u002752:54:00:cf:2d:33\u0027)"},{"line_number":230,"context_line":"        mock_gnvi.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_b8ebd8af","line":227,"in_reply_to":"bae84128_3548715b","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"7adac52331f1714f92b4fc265bbeccbf35cd5006","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def test_update_dhcp_fails(self, mock_gnvi, mock_updo):"},{"line_number":246,"context_line":"        # confirm update is called twice, both fail, and exception is raised"},{"line_number":247,"context_line":"        port2 \u003d object_utils.create_test_port("},{"line_number":248,"context_line":"            self.context, node_id\u003dself.node.id, id\u003d3,"},{"line_number":249,"context_line":"            uuid\u003d\u0027d04e451e-f7f8-4904-9f7e-5425e327e346\u0027,"},{"line_number":250,"context_line":"            address\u003d\u002752:54:00:cf:2d:33\u0027)"},{"line_number":251,"context_line":"        mock_gnvi.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_95733db4","line":248,"updated":"2016-02-25 13:46:46.000000000","message":"ditto","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"a20924d0a48d0af641407ea744700cc6e2d4a4eb","unresolved":false,"context_lines":[{"line_number":245,"context_line":"    def test_update_dhcp_fails(self, mock_gnvi, mock_updo):"},{"line_number":246,"context_line":"        # confirm update is called twice, both fail, and exception is raised"},{"line_number":247,"context_line":"        port2 \u003d object_utils.create_test_port("},{"line_number":248,"context_line":"            self.context, node_id\u003dself.node.id, id\u003d3,"},{"line_number":249,"context_line":"            uuid\u003d\u0027d04e451e-f7f8-4904-9f7e-5425e327e346\u0027,"},{"line_number":250,"context_line":"            address\u003d\u002752:54:00:cf:2d:33\u0027)"},{"line_number":251,"context_line":"        mock_gnvi.return_value \u003d ("}],"source_content_type":"text/x-python","patch_set":16,"id":"bae84128_f8cd605e","line":248,"in_reply_to":"bae84128_95733db4","updated":"2016-02-25 16:04:47.000000000","message":"Done","commit_id":"664ab7394067b1d5831228d309e892f5217a8bf9"}],"ironic/tests/unit/drivers/modules/network/test_neutron.py":[{"author":{"_account_id":12356,"name":"Vladyslav Drok","email":"vdrok@mirantis.com","username":"vdrok"},"change_message_id":"ee8708701f212bf65df4b0ab31ee0054bf7bf85f","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        port1_body[\u0027port\u0027][\u0027binding:profile\u0027] \u003d {"},{"line_number":172,"context_line":"            \u0027local_link_information\u0027: [self.port.local_link_connection]"},{"line_number":173,"context_line":"        }"},{"line_number":174,"context_line":"        if is_client_id:"},{"line_number":175,"context_line":"            port1_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d ("},{"line_number":176,"context_line":"                [{\u0027opt_name\u0027: \u0027client-id\u0027, \u0027opt_value\u0027: client_ids[0]}])"},{"line_number":177,"context_line":"        port2_body \u003d copy.deepcopy(expected_body)"}],"source_content_type":"text/x-python","patch_set":29,"id":"bacf61ea_f4cb0870","line":174,"updated":"2016-08-05 15:05:20.000000000","message":"You can do this check only once.","commit_id":"bafe38c9c9427ddcfe3c1ebade188775b4004bdf"},{"author":{"_account_id":12171,"name":"Moshe Levi","email":"moshele@nvidia.com","username":"moshele"},"change_message_id":"7175dd461684e49e5cf747cac050b716978564cb","unresolved":false,"context_lines":[{"line_number":171,"context_line":"        port1_body[\u0027port\u0027][\u0027binding:profile\u0027] \u003d {"},{"line_number":172,"context_line":"            \u0027local_link_information\u0027: [self.port.local_link_connection]"},{"line_number":173,"context_line":"        }"},{"line_number":174,"context_line":"        if is_client_id:"},{"line_number":175,"context_line":"            port1_body[\u0027port\u0027][\u0027extra_dhcp_opts\u0027] \u003d ("},{"line_number":176,"context_line":"                [{\u0027opt_name\u0027: \u0027client-id\u0027, \u0027opt_value\u0027: client_ids[0]}])"},{"line_number":177,"context_line":"        port2_body \u003d copy.deepcopy(expected_body)"}],"source_content_type":"text/x-python","patch_set":29,"id":"bacf61ea_8f4c399f","line":174,"in_reply_to":"bacf61ea_f4cb0870","updated":"2016-08-05 15:29:41.000000000","message":"Done","commit_id":"bafe38c9c9427ddcfe3c1ebade188775b4004bdf"}]}
