)]}'
{"ironic/api/controllers/v1/port.py":[{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"961ce821b013f85c3344b8e14943eba50faa0c2d","unresolved":false,"context_lines":[{"line_number":276,"context_line":"        \"\"\"Delete a port.\"\"\""},{"line_number":277,"context_line":"        if self._from_nodes:"},{"line_number":278,"context_line":"            raise exception.OperationNotPermitted"},{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        pecan.request.dbapi.destroy_port(port_id)"}],"source_content_type":"text/x-python","patch_set":4,"id":"AAAATH%2F%2FO0Y%3D","line":279,"updated":"2013-10-20 13:58:40.000000000","message":"destroy_port() accepts both id and address. So if is_valid_mac(port_id) is True, we have to replace \"-\" with \":\".\n\nHowever I\u0027m not sure that accepting an address is really intended or not.","commit_id":"71ac822612e6e650a4f46b1053a27f3c3643a10f"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"91684ab2cbbb5a32a274623bd83c62e998cc70b6","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        api_utils.validate_patch(patch)"},{"line_number":235,"context_line":"        port_dict[\u0027address\u0027] \u003d utils.format_mac(port_dict[\u0027address\u0027])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        try:"},{"line_number":238,"context_line":"            patched_port \u003d jsonpatch.apply_patch(port_dict,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FN24%3D","line":235,"updated":"2013-10-21 09:29:46.000000000","message":"This have to go after the apply_patch() function, otherwise the address could get overwritten by the one in the patch. Also port_dict have the data which is already saved in the db so ur just formating the address that already was formated at the port creation time.","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"e3326fdec315f56735cd5bb2c511a648a99c5d2c","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        api_utils.validate_patch(patch)"},{"line_number":235,"context_line":"        port_dict[\u0027address\u0027] \u003d utils.format_mac(port_dict[\u0027address\u0027])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        try:"},{"line_number":238,"context_line":"            patched_port \u003d jsonpatch.apply_patch(port_dict,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FKxY%3D","line":235,"in_reply_to":"AAAATH%2F%2FN24%3D","updated":"2013-10-22 04:43:23.000000000","message":"Lucas, I have debugged and tested, we should format the MAC address to uniform before get_by_uuid this call, else we can not find the port if the input is MAC address which format is not same with the existing one, so I will commit another patch, can you help to review again? thanks for your good comments.","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"c670ec06c48b1b2dd355332935cb0a55a691dddd","unresolved":false,"context_lines":[{"line_number":232,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":233,"context_line":""},{"line_number":234,"context_line":"        api_utils.validate_patch(patch)"},{"line_number":235,"context_line":"        port_dict[\u0027address\u0027] \u003d utils.format_mac(port_dict[\u0027address\u0027])"},{"line_number":236,"context_line":""},{"line_number":237,"context_line":"        try:"},{"line_number":238,"context_line":"            patched_port \u003d jsonpatch.apply_patch(port_dict,"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FNps%3D","line":235,"in_reply_to":"AAAATH%2F%2FN24%3D","updated":"2013-10-21 10:59:06.000000000","message":"Yes, agree with you, will move this before port.save()","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"91684ab2cbbb5a32a274623bd83c62e998cc70b6","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        # For MAC address which len is 17, will format it first"},{"line_number":281,"context_line":"        if len(port_id.strip(\u0027 \u0027)) \u003d\u003d 17:"},{"line_number":282,"context_line":"            port_id \u003d utils.format_mac(port_id)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        pecan.request.dbapi.destroy_port(port_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FN3c%3D","line":282,"updated":"2013-10-21 09:29:46.000000000","message":"Maybe using the utils.is_valid_mac() would be a better approach","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"c670ec06c48b1b2dd355332935cb0a55a691dddd","unresolved":false,"context_lines":[{"line_number":279,"context_line":""},{"line_number":280,"context_line":"        # For MAC address which len is 17, will format it first"},{"line_number":281,"context_line":"        if len(port_id.strip(\u0027 \u0027)) \u003d\u003d 17:"},{"line_number":282,"context_line":"            port_id \u003d utils.format_mac(port_id)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        pecan.request.dbapi.destroy_port(port_id)"}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FNpY%3D","line":282,"in_reply_to":"AAAATH%2F%2FN3c%3D","updated":"2013-10-21 10:59:06.000000000","message":"Agree with you, will call the existing validation method to detect if the input id is MAC address or uuid.","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5234906630841cc1252c200ae56e14998e059e8","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        api_utils.validate_patch(patch)"},{"line_number":239,"context_line":"        port_dict[\u0027address\u0027] \u003d utils.format_mac(port_dict[\u0027address\u0027])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        try:"},{"line_number":242,"context_line":"            patched_port \u003d jsonpatch.apply_patch(port_dict,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKZY%3D","line":239,"updated":"2013-10-22 09:19:36.000000000","message":"If we always store address in uniform format IMO this not needed.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ec9aaa064bccc3b94e34c8b002177a3813e33ff7","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        port_dict \u003d port.as_dict()"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"        api_utils.validate_patch(patch)"},{"line_number":239,"context_line":"        port_dict[\u0027address\u0027] \u003d utils.format_mac(port_dict[\u0027address\u0027])"},{"line_number":240,"context_line":""},{"line_number":241,"context_line":"        try:"},{"line_number":242,"context_line":"            patched_port \u003d jsonpatch.apply_patch(port_dict,"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKRw%3D","line":239,"in_reply_to":"AAAATH%2F%2FKZY%3D","updated":"2013-10-22 09:38:38.000000000","message":"Yes, agree with you.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5234906630841cc1252c200ae56e14998e059e8","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            msg \u003d _(\"Attribute(s): %s can not be removed\")"},{"line_number":253,"context_line":"            raise wsme.exc.ClientSideError(msg % \u0027, \u0027.join(missing_attr))"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        if port_dict[\u0027address\u0027] !\u003d patched_port[\u0027address\u0027]:"},{"line_number":256,"context_line":"            self._check_address(patched_port)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        self._convert_node_uuid_to_id(patched_port)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKWc%3D","line":255,"updated":"2013-10-22 09:19:36.000000000","message":"patched_port[\u0027address\u0027] \u003d utils.format_mac(patched_port[\u0027address\u0027])\n\nIMO also needed here for further save port address in uniform format\n\nor as alternative has something like _check_and_unify_address() instead of\n_check_address()","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ec9aaa064bccc3b94e34c8b002177a3813e33ff7","unresolved":false,"context_lines":[{"line_number":252,"context_line":"            msg \u003d _(\"Attribute(s): %s can not be removed\")"},{"line_number":253,"context_line":"            raise wsme.exc.ClientSideError(msg % \u0027, \u0027.join(missing_attr))"},{"line_number":254,"context_line":""},{"line_number":255,"context_line":"        if port_dict[\u0027address\u0027] !\u003d patched_port[\u0027address\u0027]:"},{"line_number":256,"context_line":"            self._check_address(patched_port)"},{"line_number":257,"context_line":""},{"line_number":258,"context_line":"        self._convert_node_uuid_to_id(patched_port)"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKPM%3D","line":255,"in_reply_to":"AAAATH%2F%2FKWc%3D","updated":"2013-10-22 09:38:38.000000000","message":"yes, will try to fix, thank you.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2a0bfd29ba860ee17fe7f1f6562c97960db8bbea","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _check_address(self, port_dict):"},{"line_number":149,"context_line":"        if not utils.is_valid_mac(port_dict[\u0027address\u0027]):"},{"line_number":150,"context_line":"            raise wsme.exc.ClientSideError(_(\"Invalid MAC address format,\""},{"line_number":151,"context_line":"                     \"does not support hyphens as separator: %s\")"},{"line_number":152,"context_line":"                     % port_dict[\u0027address\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FeE%3D","line":150,"updated":"2013-10-23 08:15:26.000000000","message":"Maybe better to specify a message, like\n\nif \u0027-\u0027 in port_dict[\u0027address\u0027]:\n    msg \u003d \"does not support hyphens as separator\"\nelse:\n    msg \u003d \"Invalid MAC address format\"","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"51d195ed04dd09bf10b58cb314184ebff2b6a0ad","unresolved":false,"context_lines":[{"line_number":147,"context_line":""},{"line_number":148,"context_line":"    def _check_address(self, port_dict):"},{"line_number":149,"context_line":"        if not utils.is_valid_mac(port_dict[\u0027address\u0027]):"},{"line_number":150,"context_line":"            raise wsme.exc.ClientSideError(_(\"Invalid MAC address format,\""},{"line_number":151,"context_line":"                     \"does not support hyphens as separator: %s\")"},{"line_number":152,"context_line":"                     % port_dict[\u0027address\u0027])"},{"line_number":153,"context_line":""}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FTY%3D","line":150,"in_reply_to":"AAAATX%2F%2F%2FeE%3D","updated":"2013-10-23 08:55:06.000000000","message":"Good idea, will apply, thank you.","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"2a0bfd29ba860ee17fe7f1f6562c97960db8bbea","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                     % port_dict[\u0027address\u0027])"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            if pecan.request.dbapi.get_port(port_dict[\u0027address\u0027]):"},{"line_number":156,"context_line":"                raise wsme.exc.ClientSideError(_(\"MAC address already \""},{"line_number":157,"context_line":"                                                 \"exists.\"))"},{"line_number":158,"context_line":"        except exception.PortNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FVA%3D","line":155,"updated":"2013-10-23 08:15:26.000000000","message":"There is a problem with macs letter case and some DB backends\n\nMySQL: \n\nmysql\u003e select * from data where descr \u003d \u0027AAAA\u0027;\n\n| id | descr |\n\n|  1 | aaaa  |\n\nPostgres:\ntest\u003d# SELECT * FROM data WHERE descr \u003d \u0027AAAA\u0027;\n id | descr \n----+-------\n(0 rows)\n\ntest\u003d# SELECT * FROM data WHERE descr \u003d \u0027aaaa\u0027;\n id | descr \n----+-------\n  1 | aaaa\n\nFor Postgres \u002711:22:33:aa:bb:cc\u0027 will not be found if  \u002711:22:33:AA:BB:CC\u0027 present in DB.","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"4f81bd3bf85530ee91bc07ee671f3e52e9e11947","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                     % port_dict[\u0027address\u0027])"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            if pecan.request.dbapi.get_port(port_dict[\u0027address\u0027]):"},{"line_number":156,"context_line":"                raise wsme.exc.ClientSideError(_(\"MAC address already \""},{"line_number":157,"context_line":"                                                 \"exists.\"))"},{"line_number":158,"context_line":"        except exception.PortNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FDM%3D","line":155,"in_reply_to":"AAAATX%2F%2F%2FPw%3D","updated":"2013-10-23 09:29:30.000000000","message":"IMO:\n\n1) Quick fix - store all macs in uppercase.\n\n2) TODO - create a custom SQLAlchemy type like db.sqlalchemy.types.IPAddress in \nNova for mac with \u0027macaddr\u0027 postgres type for postgres dialect.","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"51d195ed04dd09bf10b58cb314184ebff2b6a0ad","unresolved":false,"context_lines":[{"line_number":152,"context_line":"                     % port_dict[\u0027address\u0027])"},{"line_number":153,"context_line":""},{"line_number":154,"context_line":"        try:"},{"line_number":155,"context_line":"            if pecan.request.dbapi.get_port(port_dict[\u0027address\u0027]):"},{"line_number":156,"context_line":"                raise wsme.exc.ClientSideError(_(\"MAC address already \""},{"line_number":157,"context_line":"                                                 \"exists.\"))"},{"line_number":158,"context_line":"        except exception.PortNotFound:"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FPw%3D","line":155,"in_reply_to":"AAAATX%2F%2F%2FVA%3D","updated":"2013-10-23 08:55:06.000000000","message":"Yes, agree with you, for MySQL it is Not case sensitive, but Postgres is, so this is common database \u0027case sensitive\u0027 issue, not sure if sqlalchemy support such switch to turn on/off  \u0027case sensitive\u0027,or should we enhance this in the sqlalchemy lib to add \"binary\" to do type coercions on SQL level?","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"6f01687207ec25e25b022ea1fb77db4ada03ddf6","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                msg \u003d _(\"does not support hyphens as separator: %s\") \\"},{"line_number":152,"context_line":"                        % port_dict[\u0027address\u0027]"},{"line_number":153,"context_line":"            else:"},{"line_number":154,"context_line":"                msg \u003d _(\"Invalid MAC address format\") % port_dict[\u0027address\u0027]"},{"line_number":155,"context_line":"            raise wsme.exc.ClientSideError(msg)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATX%2F%2F%2FIM%3D","line":154,"updated":"2013-10-23 09:10:56.000000000","message":"You forgot %s here","commit_id":"aa304083009d569e47689089c35e75ecaf810739"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"34ccbcfd0d473c7e422219741e5e4eeb3010ce0d","unresolved":false,"context_lines":[{"line_number":151,"context_line":"                msg \u003d _(\"does not support hyphens as separator: %s\") \\"},{"line_number":152,"context_line":"                        % port_dict[\u0027address\u0027]"},{"line_number":153,"context_line":"            else:"},{"line_number":154,"context_line":"                msg \u003d _(\"Invalid MAC address format\") % port_dict[\u0027address\u0027]"},{"line_number":155,"context_line":"            raise wsme.exc.ClientSideError(msg)"},{"line_number":156,"context_line":""},{"line_number":157,"context_line":"        try:"}],"source_content_type":"text/x-python","patch_set":15,"id":"AAAATX%2F%2F%2FFQ%3D","line":154,"in_reply_to":"AAAATX%2F%2F%2FIM%3D","updated":"2013-10-23 09:24:10.000000000","message":"Yes, I run \u0027testr run\u0027, but this issue can not be found in our UT:)","commit_id":"aa304083009d569e47689089c35e75ecaf810739"}],"ironic/common/utils.py":[{"author":{"_account_id":6773,"name":"Lucas Alvares Gomes","email":"lucasagomes@gmail.com","username":"lucasagomes"},"change_message_id":"91684ab2cbbb5a32a274623bd83c62e998cc70b6","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    so have to format to single one(colons) and store it to avoid confusing"},{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FN2w%3D","line":313,"updated":"2013-10-21 09:29:46.000000000","message":"Maybe checking if it\u0027s also a valid macaddress ? is_valid_mac()","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"c670ec06c48b1b2dd355332935cb0a55a691dddd","unresolved":false,"context_lines":[{"line_number":310,"context_line":"    so have to format to single one(colons) and store it to avoid confusing"},{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FNoA%3D","line":313,"in_reply_to":"AAAATH%2F%2FN2w%3D","updated":"2013-10-21 10:59:06.000000000","message":"Lucas, this method is_valid_mac should be called before formatting,  for invalid mac, no sense to call format_mac method function I think, and not sure if we raise wsme exception is ok in our utils method, how do you think?","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"a42d85264ce066e9a03b85bc50d1af2dfdc77b17","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":6,"id":"AAAATH%2F%2FKgM%3D","line":314,"updated":"2013-10-22 07:41:51.000000000","message":"Haomeng, thank you for finding of problem with macs. I think also that we must format macs to uniform letter case, example: 01:23:45:67:89:ab and 01:23:45:67:89:AB is the same address, but problem with get_port() possible.","commit_id":"b7be86f62301cf5a0d9178ae5ac580333ca8707c"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5234906630841cc1252c200ae56e14998e059e8","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKUQ%3D","line":314,"updated":"2013-10-22 09:19:36.000000000","message":"I think also that we must format macs to uniform letter case, example: 01:23:45:67:89:ab and 01:23:45:67:89:AB is the same address, but problem with get_port() possible.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"1383a1135dc91baec817d7b442c8f26c0e1c8d26","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FJ30%3D","line":314,"in_reply_to":"AAAATH%2F%2FKJE%3D","updated":"2013-10-22 12:04:09.000000000","message":"Got it, thank you Yuriy.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"705d40213ff457538eb4782573bdd3e022d5205c","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKJE%3D","line":314,"in_reply_to":"AAAATH%2F%2FKO4%3D","updated":"2013-10-22 10:17:50.000000000","message":"AFAIK this is DB backend specific (MySQL).","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ec9aaa064bccc3b94e34c8b002177a3813e33ff7","unresolved":false,"context_lines":[{"line_number":311,"context_line":"    \"\"\""},{"line_number":312,"context_line":""},{"line_number":313,"context_line":"    if address:"},{"line_number":314,"context_line":"        return address.replace(\u0027-\u0027, \u0027:\u0027)"},{"line_number":315,"context_line":"    return None"},{"line_number":316,"context_line":""},{"line_number":317,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKO4%3D","line":314,"in_reply_to":"AAAATH%2F%2FKUQ%3D","updated":"2013-10-22 09:38:38.000000000","message":"yes, agree with you, we have to make sure case-insensitive for MAC address, good idea. \n\nHowever I verified, the findings is we support MAC address  case-insensitive already, will try to debug code and response to you here.\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\n\nroot@ubuntu1:~/ironic# ironic port-show  AA:BB:CC:DD:EE:aa\n\n+----------+--------------------------------------+\n\n| Property | Value                                |\n\n+----------+--------------------------------------+\n\n| extra    | {}                                   |\n\n| uuid     | 4dd823c8-4eaa-4c4a-abd7-0726d878db78 |\n\n| address  | AA:BB:CC:DD:EE:AA                    |\n\n+----------+--------------------------------------+\n\n\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d\u003d","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"b362f0ede5e6248de03d93fb4c4c19068cdbdca7","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"def is_valid_mac(address):"},{"line_number":300,"context_line":"    \"\"\"Verify the format of a MAC addres.\"\"\""},{"line_number":301,"context_line":"    m \u003d \"[0-9a-f]{2}([:])[0-9a-f]{2}(\\\\1[0-9a-f]{2}){4}$\""},{"line_number":302,"context_line":"    if isinstance(address, six.string_types) and re.match(m, address.lower()):"},{"line_number":303,"context_line":"        return True"},{"line_number":304,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2Frg%3D","line":301,"updated":"2013-10-23 06:18:39.000000000","message":"This regexp can be simpler\n\n    [0-9a-f]{2}(:[0-9a-f]{2}){5}$","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"51d195ed04dd09bf10b58cb314184ebff2b6a0ad","unresolved":false,"context_lines":[{"line_number":298,"context_line":""},{"line_number":299,"context_line":"def is_valid_mac(address):"},{"line_number":300,"context_line":"    \"\"\"Verify the format of a MAC addres.\"\"\""},{"line_number":301,"context_line":"    m \u003d \"[0-9a-f]{2}([:])[0-9a-f]{2}(\\\\1[0-9a-f]{2}){4}$\""},{"line_number":302,"context_line":"    if isinstance(address, six.string_types) and re.match(m, address.lower()):"},{"line_number":303,"context_line":"        return True"},{"line_number":304,"context_line":"    return False"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FUs%3D","line":301,"in_reply_to":"AAAATX%2F%2F%2Frg%3D","updated":"2013-10-23 08:55:06.000000000","message":"Thanks for your comments, I will remove \u0027[]\u0027","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"}],"ironic/tests/api/test_ports.py":[{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"e5234906630841cc1252c200ae56e14998e059e8","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"},{"line_number":283,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":284,"context_line":"        result \u003d self.get_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027])"},{"line_number":285,"context_line":"        self.assertEqual(result[\u0027extra\u0027], extra)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKSs%3D","line":285,"updated":"2013-10-22 09:19:36.000000000","message":"Please check \u0027address\u0027, not \u0027extra\u0027.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ec9aaa064bccc3b94e34c8b002177a3813e33ff7","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"},{"line_number":283,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":284,"context_line":"        result \u003d self.get_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027])"},{"line_number":285,"context_line":"        self.assertEqual(result[\u0027extra\u0027], extra)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKP0%3D","line":285,"in_reply_to":"AAAATH%2F%2FKQw%3D","updated":"2013-10-22 09:38:38.000000000","message":"Ok, will add, thanks for your good comments.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"fff3dd72c3824b68b91986f2eb60f1961b8fa7e8","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"},{"line_number":283,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":284,"context_line":"        result \u003d self.get_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027])"},{"line_number":285,"context_line":"        self.assertEqual(result[\u0027extra\u0027], extra)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKQw%3D","line":285,"in_reply_to":"AAAATH%2F%2FKSs%3D","updated":"2013-10-22 09:27:16.000000000","message":"And add \u0027address\u0027 in path, for check that mac stored in uniform format.\nLet it be in new test_update_address().","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"ec9aaa064bccc3b94e34c8b002177a3813e33ff7","unresolved":false,"context_lines":[{"line_number":282,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"},{"line_number":283,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":284,"context_line":"        result \u003d self.get_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027])"},{"line_number":285,"context_line":"        self.assertEqual(result[\u0027extra\u0027], extra)"},{"line_number":286,"context_line":""},{"line_number":287,"context_line":""},{"line_number":288,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":8,"id":"AAAATH%2F%2FKP4%3D","line":285,"in_reply_to":"AAAATH%2F%2FKSs%3D","updated":"2013-10-22 09:38:38.000000000","message":"Ok, will fix, thank you.","commit_id":"594c09b720f8f098e9b65ae1d72e402998035e93"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f533769948652296c2289bb7f0b04cde9f853263","unresolved":false,"context_lines":[{"line_number":165,"context_line":"        pdict \u003d dbutils.get_test_port(address\u003daddress,"},{"line_number":166,"context_line":"                                      uuid\u003duuidutils.generate_uuid())"},{"line_number":167,"context_line":"        self.post_json(\u0027/ports\u0027, pdict)"},{"line_number":168,"context_line":""},{"line_number":169,"context_line":"        pdict \u003d dbutils.get_test_port()"},{"line_number":170,"context_line":"        response \u003d self.patch_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027],"},{"line_number":171,"context_line":"                                   [{\u0027path\u0027: \u0027/address\u0027,"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FJg8%3D","line":168,"updated":"2013-10-22 13:47:02.000000000","message":"I add line\n\naddress \u003d \u002711:22:33:aa:bb:cc\u0027\n\nhere with your patch. \u002711:22:33:aa:bb:cc\u0027 must be the same as \u002711:22:33:AA:BB:CC\u0027\nAnd unittest result:\n\nPATCH: /v1/ports/1be26c0b-03f2-4d2e-ae87-c02d7f33c781 [{\u0027path\u0027: \u0027/address\u0027, \u0027value\u0027: \u002711:22:33:aa:bb:cc\u0027, \u0027op\u0027: \u0027replace\u0027}]\n\nGOT:Response: 200 OK\nContent-Type: application/json; charset\u003dUTF-8\n\n{\"node_id\": \"1be26c0b-03f2-4d2e-ae87-c02d7f33c123\", \"extra\": {}, \"uuid\": \"1be26c0b-03f2-4d2e-ae87-c02d7f33c781\", \"links\": [{\"href\": \"http://localhost/v1/ports/1be26c0b-03f2-4d2e-ae87-c02d7f33c781\", \"rel\": \"self\"}, {\"href\": \"http://localhost/ports/1be26c0b-03f2-4d2e-ae87-c02d7f33c781\", \"rel\": \"bookmark\"}], \"address\": \"11:22:33:aa:bb:cc\"}\n\nraise MismatchError(matchee, matcher, mismatch, verbose)\nMismatchError: 200 !\u003d 400\n\nSee my comment\nhttps://review.openstack.org/#/c/52761/8/ironic/common/utils.py","commit_id":"c7eee4a9bb9999c39b2deef049e9437d93f1432f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f533769948652296c2289bb7f0b04cde9f853263","unresolved":false,"context_lines":[{"line_number":281,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"},{"line_number":282,"context_line":"        self.assertEqual(response.status_code, 200)"},{"line_number":283,"context_line":"        result \u003d self.get_json(\u0027/ports/%s\u0027 % pdict[\u0027uuid\u0027])"},{"line_number":284,"context_line":"        self.assertEqual(result[\u0027address\u0027], pdict[\u0027address\u0027].replace(\u0027-\u0027, \u0027:\u0027))"},{"line_number":285,"context_line":""},{"line_number":286,"context_line":"    def test_update_address(self):"},{"line_number":287,"context_line":"        pdict \u003d dbutils.get_test_port()"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FJio%3D","line":284,"updated":"2013-10-22 13:47:02.000000000","message":"Sorry if explained wrong in prev. comment. If is already separate test for address update, better check \u0027extra\u0027 here.","commit_id":"c7eee4a9bb9999c39b2deef049e9437d93f1432f"},{"author":{"_account_id":7711,"name":"Yuriy Zveryanskyy","email":"yzveryanskyy@mirantis.com","username":"yuriyz"},"change_message_id":"f533769948652296c2289bb7f0b04cde9f853263","unresolved":false,"context_lines":[{"line_number":289,"context_line":"        hyphensMAC \u003d colonsMAC.replace(\u0027:\u0027, \u0027-\u0027)"},{"line_number":290,"context_line":"        pdict[\u0027address\u0027] \u003d hyphensMAC"},{"line_number":291,"context_line":"        response \u003d self.patch_json(\u0027/ports/%s\u0027 % pdict[\u0027address\u0027],"},{"line_number":292,"context_line":"                                   [{\u0027path\u0027: \u0027/extra/foo\u0027,"},{"line_number":293,"context_line":"                                     \u0027value\u0027: \u0027bar\u0027,"},{"line_number":294,"context_line":"                                     \u0027op\u0027: \u0027add\u0027}])"},{"line_number":295,"context_line":"        self.assertEqual(response.content_type, \u0027application/json\u0027)"}],"source_content_type":"text/x-python","patch_set":9,"id":"AAAATH%2F%2FJnw%3D","line":292,"updated":"2013-10-22 13:47:02.000000000","message":"address not in patch, see l156 for example","commit_id":"c7eee4a9bb9999c39b2deef049e9437d93f1432f"},{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"c05a014bb31596047556f13fd87e1a26decfb1a2","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                          self.patch_json,"},{"line_number":277,"context_line":"                          \u0027/ports/%s\u0027 % pdict[\u0027address\u0027],"},{"line_number":278,"context_line":"                          [{\u0027path\u0027: \u0027/extra/foo\u0027,"},{"line_number":279,"context_line":"                          \u0027value\u0027: \u0027bar\u0027}])"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F%2F%2F1o%3D","line":279,"updated":"2013-10-24 03:09:03.000000000","message":"The other calls of self.patch_json have \u0027op\u0027 in these params. Is it not needed here? (I dont know the mechanisms of API at all, so this is just a question)","commit_id":"c989c887161df50f0e00bce12a8b2bc63767c7b1"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"87785c58b4c5ec4d0cf01917e5dc0da056daf069","unresolved":false,"context_lines":[{"line_number":276,"context_line":"                          self.patch_json,"},{"line_number":277,"context_line":"                          \u0027/ports/%s\u0027 % pdict[\u0027address\u0027],"},{"line_number":278,"context_line":"                          [{\u0027path\u0027: \u0027/extra/foo\u0027,"},{"line_number":279,"context_line":"                          \u0027value\u0027: \u0027bar\u0027}])"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":""},{"line_number":282,"context_line":"class TestPost(base.FunctionalTest):"}],"source_content_type":"text/x-python","patch_set":19,"id":"AAAATn%2F%2F%2Fzw%3D","line":279,"in_reply_to":"AAAATn%2F%2F%2F1o%3D","updated":"2013-10-24 03:20:23.000000000","message":"Yes, I will remove this test method, thank you.","commit_id":"c989c887161df50f0e00bce12a8b2bc63767c7b1"}],"ironic/tests/test_utils.py":[{"author":{"_account_id":3068,"name":"Arata Notsu","email":"notsu@virtualtech.jp","username":"arata776"},"change_message_id":"b362f0ede5e6248de03d93fb4c4c19068cdbdca7","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        self.assertFalse(utils.is_valid_mac(\"127.0.0.1\"))"},{"line_number":299,"context_line":"        self.assertFalse(utils.is_valid_mac(\"not:a:mac:address\"))"},{"line_number":300,"context_line":"        self.assertFalse(utils.is_valid_mac(\"52-54-00-cf-2d-31\"))"},{"line_number":301,"context_line":"        self.assertFalse(utils.is_valid_mac(\"aa bb cc dd ee ff\"))"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def test_safe_rstrip(self):"},{"line_number":304,"context_line":"        value \u003d \u0027/test/\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FrM%3D","line":301,"updated":"2013-10-23 06:18:39.000000000","message":"Please test an uppercase address too","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"},{"author":{"_account_id":8106,"name":"Haomeng,Wang","email":"wanghaomeng@gmail.com","username":"whaom"},"change_message_id":"51d195ed04dd09bf10b58cb314184ebff2b6a0ad","unresolved":false,"context_lines":[{"line_number":298,"context_line":"        self.assertFalse(utils.is_valid_mac(\"127.0.0.1\"))"},{"line_number":299,"context_line":"        self.assertFalse(utils.is_valid_mac(\"not:a:mac:address\"))"},{"line_number":300,"context_line":"        self.assertFalse(utils.is_valid_mac(\"52-54-00-cf-2d-31\"))"},{"line_number":301,"context_line":"        self.assertFalse(utils.is_valid_mac(\"aa bb cc dd ee ff\"))"},{"line_number":302,"context_line":""},{"line_number":303,"context_line":"    def test_safe_rstrip(self):"},{"line_number":304,"context_line":"        value \u003d \u0027/test/\u0027"}],"source_content_type":"text/x-python","patch_set":13,"id":"AAAATX%2F%2F%2FUo%3D","line":301,"in_reply_to":"AAAATX%2F%2F%2FrM%3D","updated":"2013-10-23 08:55:06.000000000","message":"OK, will add, thank you.","commit_id":"bf94de75c2f82da2a9b3ebdce49573c7f5b44a74"}]}
