)]}'
{"/COMMIT_MSG":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":8,"context_line":""},{"line_number":9,"context_line":"Support parsing extra specs properties as below:"},{"line_number":10,"context_line":"   hw:pmem\u003d4GB,SMALL"},{"line_number":11,"context_line":"And then thanslate it to placement resource request."},{"line_number":12,"context_line":""},{"line_number":13,"context_line":"Change-Id: Ifeeb7710fb39befbd0d0693ca2b4c3aa79878127"},{"line_number":14,"context_line":"Partially-Implements: blueprint virtual-persistent-memory"}],"source_content_type":"text/x-gerrit-commit-message","patch_set":10,"id":"7faddb67_7e6583ae","line":11,"range":{"start_line":11,"start_character":9,"end_line":11,"end_character":18},"updated":"2019-08-30 21:01:55.000000000","message":"translate","commit_id":"9847507d533b07313a33b4397744a4588194134f"}],"nova/exception.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":2502,"context_line":""},{"line_number":2503,"context_line":""},{"line_number":2504,"context_line":"class InvalidVPMEMConfig(NovaException):"},{"line_number":2505,"context_line":"    msg_fmt \u003d _(\"The vpmem config in flavor %(vpmem_label)s is invalid, \""},{"line_number":2506,"context_line":"                \"it must be alphanumeric.\")"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_3e094bdc","line":2505,"range":{"start_line":2505,"start_character":46,"end_line":2505,"end_character":57},"updated":"2019-08-30 21:01:55.000000000","message":"is this supposed to be flavor_name?\n\n[later] No, looks like you meant for the message to say something more like: \"Invalid vpmem label %(vpmem_label)s in flavor.\" But as noted further on, I\u0027m not sure we should bother with this exception at all.","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af1a42f0b01fdbbeb3e37207054923d04085d6c3","unresolved":false,"context_lines":[{"line_number":2524,"context_line":""},{"line_number":2525,"context_line":""},{"line_number":2526,"context_line":"class InvalidVPMEMConfig(NovaException):"},{"line_number":2527,"context_line":"    msg_fmt \u003d _(\"The vpmem config in flavor %(vpmem_label)s is invalid, \""},{"line_number":2528,"context_line":"                \"it must be alphanumeric.\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_b49ff74e","line":2527,"range":{"start_line":2527,"start_character":37,"end_line":2527,"end_character":59},"updated":"2019-09-09 21:55:06.000000000","message":"This reads as if %(vpmem_label)s is the flavor name. Suggest:\n\n \"The flavor vpmem label \u0027%(vpmem_label)s\u0027 is invalid...\"\n\n...but I don\u0027t think you should be doing validation here -- see other comment.","commit_id":"88a115a20b7b54e2ddad75a92bf70b5d20335445"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d5a78d7a5a4a19d15be49c4f2ce72a7bdcbbc364","unresolved":false,"context_lines":[{"line_number":2524,"context_line":""},{"line_number":2525,"context_line":""},{"line_number":2526,"context_line":"class InvalidVPMEMConfig(NovaException):"},{"line_number":2527,"context_line":"    msg_fmt \u003d _(\"The vpmem config in flavor %(vpmem_label)s is invalid, \""},{"line_number":2528,"context_line":"                \"it must be alphanumeric.\")"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_b3d62827","line":2527,"range":{"start_line":2527,"start_character":37,"end_line":2527,"end_character":59},"in_reply_to":"5faad753_b49ff74e","updated":"2019-09-10 06:16:59.000000000","message":"drop this exception","commit_id":"88a115a20b7b54e2ddad75a92bf70b5d20335445"}],"nova/scheduler/request_filter.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    return True"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"@trace_request_filter"},{"line_number":180,"context_line":"def require_vpmems(ctxt, request_spec):"},{"line_number":181,"context_line":"    \"\"\"When the hw:pmem extra spec, require hosts which can provide"},{"line_number":182,"context_line":"    enough vpmem resources."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_5e1687f4","line":179,"updated":"2019-08-30 21:01:55.000000000","message":"This isn\u0027t really a request filter; it needs to be moved over to ResourceRequest.__init__ like what was done here:\n\nhttps://review.opendev.org/#/c/664420/45..48","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"067deece6ce727d7a121b8a5bbaf9c515a5f48d6","unresolved":false,"context_lines":[{"line_number":176,"context_line":"    return True"},{"line_number":177,"context_line":""},{"line_number":178,"context_line":""},{"line_number":179,"context_line":"@trace_request_filter"},{"line_number":180,"context_line":"def require_vpmems(ctxt, request_spec):"},{"line_number":181,"context_line":"    \"\"\"When the hw:pmem extra spec, require hosts which can provide"},{"line_number":182,"context_line":"    enough vpmem resources."}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_03b0a88a","line":179,"in_reply_to":"7faddb67_5e1687f4","updated":"2019-09-02 13:02:10.000000000","message":"Done","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    enough vpmem resources."},{"line_number":183,"context_line":"    \"\"\""},{"line_number":184,"context_line":"    vpmem_list \u003d hardware.get_vpmems(request_spec.flavor)"},{"line_number":185,"context_line":"    if vpmem_list:"},{"line_number":186,"context_line":"        amount_by_rc \u003d {}"},{"line_number":187,"context_line":"        for vpmem_label in vpmem_list:"},{"line_number":188,"context_line":"            resource_class \u003d \"CUSTOM_PMEM_NAMESPACE_%(label)s\" % \\"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_ded7d721","line":185,"range":{"start_line":185,"start_character":4,"end_line":185,"end_character":18},"updated":"2019-08-30 21:01:55.000000000","message":"if not vpmem_list:\n    return False","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    \"\"\""},{"line_number":184,"context_line":"    vpmem_list \u003d hardware.get_vpmems(request_spec.flavor)"},{"line_number":185,"context_line":"    if vpmem_list:"},{"line_number":186,"context_line":"        amount_by_rc \u003d {}"},{"line_number":187,"context_line":"        for vpmem_label in vpmem_list:"},{"line_number":188,"context_line":"            resource_class \u003d \"CUSTOM_PMEM_NAMESPACE_%(label)s\" % \\"},{"line_number":189,"context_line":"                    {\u0027label\u0027: vpmem_label}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_7ee823de","line":186,"range":{"start_line":186,"start_character":23,"end_line":186,"end_character":25},"updated":"2019-08-30 21:01:55.000000000","message":"defaultdict(int)","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"067deece6ce727d7a121b8a5bbaf9c515a5f48d6","unresolved":false,"context_lines":[{"line_number":183,"context_line":"    \"\"\""},{"line_number":184,"context_line":"    vpmem_list \u003d hardware.get_vpmems(request_spec.flavor)"},{"line_number":185,"context_line":"    if vpmem_list:"},{"line_number":186,"context_line":"        amount_by_rc \u003d {}"},{"line_number":187,"context_line":"        for vpmem_label in vpmem_list:"},{"line_number":188,"context_line":"            resource_class \u003d \"CUSTOM_PMEM_NAMESPACE_%(label)s\" % \\"},{"line_number":189,"context_line":"                    {\u0027label\u0027: vpmem_label}"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_63b71c87","line":186,"range":{"start_line":186,"start_character":23,"end_line":186,"end_character":25},"in_reply_to":"7faddb67_7ee823de","updated":"2019-09-02 13:02:10.000000000","message":"Done","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    if vpmem_list:"},{"line_number":186,"context_line":"        amount_by_rc \u003d {}"},{"line_number":187,"context_line":"        for vpmem_label in vpmem_list:"},{"line_number":188,"context_line":"            resource_class \u003d \"CUSTOM_PMEM_NAMESPACE_%(label)s\" % \\"},{"line_number":189,"context_line":"                    {\u0027label\u0027: vpmem_label}"},{"line_number":190,"context_line":"            amount_by_rc.setdefault(resource_class, 0)"},{"line_number":191,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":192,"context_line":"        for resource_class, amount in amount_by_rc.items():"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_7e134302","line":189,"range":{"start_line":188,"start_character":29,"end_line":189,"end_character":42},"updated":"2019-08-30 21:01:55.000000000","message":"again, os_traits.normalize_name(\u0027PMEM_NAMESPACE_\u0027 + vpmem_label)","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"067deece6ce727d7a121b8a5bbaf9c515a5f48d6","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    if vpmem_list:"},{"line_number":186,"context_line":"        amount_by_rc \u003d {}"},{"line_number":187,"context_line":"        for vpmem_label in vpmem_list:"},{"line_number":188,"context_line":"            resource_class \u003d \"CUSTOM_PMEM_NAMESPACE_%(label)s\" % \\"},{"line_number":189,"context_line":"                    {\u0027label\u0027: vpmem_label}"},{"line_number":190,"context_line":"            amount_by_rc.setdefault(resource_class, 0)"},{"line_number":191,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":192,"context_line":"        for resource_class, amount in amount_by_rc.items():"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_03d988f2","line":189,"range":{"start_line":188,"start_character":29,"end_line":189,"end_character":42},"in_reply_to":"7faddb67_7e134302","updated":"2019-09-02 13:02:10.000000000","message":"Done","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            resource \u003d \u0027resources:\u0027 + resource_class"},{"line_number":194,"context_line":"            request_spec.flavor.extra_specs[resource] \u003d amount"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        LOG.debug(\"require vpmem resources request filter added \""},{"line_number":197,"context_line":"              \"required resource CUSTOM_PMEM_NAMESPACE_xxx\")"},{"line_number":198,"context_line":"    return True"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_feb5f3ed","line":197,"range":{"start_line":196,"start_character":8,"end_line":197,"end_character":60},"updated":"2019-08-30 21:01:55.000000000","message":"move this into the above loop and print the real RC name.","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"067deece6ce727d7a121b8a5bbaf9c515a5f48d6","unresolved":false,"context_lines":[{"line_number":193,"context_line":"            resource \u003d \u0027resources:\u0027 + resource_class"},{"line_number":194,"context_line":"            request_spec.flavor.extra_specs[resource] \u003d amount"},{"line_number":195,"context_line":""},{"line_number":196,"context_line":"        LOG.debug(\"require vpmem resources request filter added \""},{"line_number":197,"context_line":"              \"required resource CUSTOM_PMEM_NAMESPACE_xxx\")"},{"line_number":198,"context_line":"    return True"},{"line_number":199,"context_line":""},{"line_number":200,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_43b22098","line":197,"range":{"start_line":196,"start_character":8,"end_line":197,"end_character":60},"in_reply_to":"7faddb67_feb5f3ed","updated":"2019-09-02 13:02:10.000000000","message":"Done","commit_id":"9847507d533b07313a33b4397744a4588194134f"}],"nova/scheduler/utils.py":[{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b878e70c9a7007b7c95a2ba7d00fc3ffc4576f2a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        amount_by_rc \u003d collections.defaultdict(int)"},{"line_number":194,"context_line":"        for vpmem_label in vpmem_labels:"},{"line_number":195,"context_line":"            resource_class \u003d os_traits.normalize_name("},{"line_number":196,"context_line":"                \"PMEM_NAMESPACE_\" + vpmem_label)"},{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_9dd065ca","line":196,"range":{"start_line":196,"start_character":36,"end_line":196,"end_character":47},"updated":"2019-09-03 16:43:32.000000000","message":"As noted later, what happens if this is non-ASCII or has things like whitespace, semi-colons, etc.","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"e37a982248e9d800ce7f0e8e5ce054ebdc2ed03a","unresolved":false,"context_lines":[{"line_number":193,"context_line":"        amount_by_rc \u003d collections.defaultdict(int)"},{"line_number":194,"context_line":"        for vpmem_label in vpmem_labels:"},{"line_number":195,"context_line":"            resource_class \u003d os_traits.normalize_name("},{"line_number":196,"context_line":"                \"PMEM_NAMESPACE_\" + vpmem_label)"},{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_53d64e29","line":196,"range":{"start_line":196,"start_character":36,"end_line":196,"end_character":47},"in_reply_to":"7faddb67_9dd065ca","updated":"2019-09-04 12:53:30.000000000","message":"os_traits.normalize_name will handle these cases, just ignoring those characters.","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b878e70c9a7007b7c95a2ba7d00fc3ffc4576f2a","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"},{"line_number":200,"context_line":"            LOG.debug(\"Add required resource CUSTOM_PMEM_NAMESPACE_%s: \""},{"line_number":201,"context_line":"                      \"amount\u003d%s\", resource_class, amount)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @property"},{"line_number":204,"context_line":"    def group_policy(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_7d7d69e4","line":201,"range":{"start_line":200,"start_character":22,"end_line":201,"end_character":58},"updated":"2019-09-03 16:43:32.000000000","message":"Try:\n\n  Added CUSTOM_PMEM_NAMESPACE_%s\u003d%d to requested resources\n\nSo it matches above","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"e37a982248e9d800ce7f0e8e5ce054ebdc2ed03a","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"},{"line_number":200,"context_line":"            LOG.debug(\"Add required resource CUSTOM_PMEM_NAMESPACE_%s: \""},{"line_number":201,"context_line":"                      \"amount\u003d%s\", resource_class, amount)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @property"},{"line_number":204,"context_line":"    def group_policy(self):"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_13dc5643","line":201,"range":{"start_line":200,"start_character":22,"end_line":201,"end_character":58},"in_reply_to":"7faddb67_7d7d69e4","updated":"2019-09-04 12:53:30.000000000","message":"Done","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"463a6383f5af272fb5418850774a897187a52409","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            return"},{"line_number":193,"context_line":"        amount_by_rc \u003d collections.defaultdict(int)"},{"line_number":194,"context_line":"        for vpmem_label in vpmem_labels:"},{"line_number":195,"context_line":"            resource_class \u003d os_traits.normalize_name("},{"line_number":196,"context_line":"                \"PMEM_NAMESPACE_\" + vpmem_label)"},{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_c7b10303","line":195,"range":{"start_line":195,"start_character":29,"end_line":195,"end_character":38},"updated":"2019-09-05 06:21:02.000000000","message":"you should use the os_resource_class.normalize_name","commit_id":"0b83d1f15b071dd89360470ce373220cffbd053b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"790fcc5e88171f3174ba78a1813ea8d40cbccfb9","unresolved":false,"context_lines":[{"line_number":192,"context_line":"            return"},{"line_number":193,"context_line":"        amount_by_rc \u003d collections.defaultdict(int)"},{"line_number":194,"context_line":"        for vpmem_label in vpmem_labels:"},{"line_number":195,"context_line":"            resource_class \u003d os_traits.normalize_name("},{"line_number":196,"context_line":"                \"PMEM_NAMESPACE_\" + vpmem_label)"},{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_e28c2a36","line":195,"range":{"start_line":195,"start_character":29,"end_line":195,"end_character":38},"in_reply_to":"7faddb67_c7b10303","updated":"2019-09-05 10:37:44.000000000","message":"Done","commit_id":"0b83d1f15b071dd89360470ce373220cffbd053b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"df9c0037889457802ae0e8ed3ca950343a511945","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                  orc.MEM_ENCRYPTION_CONTEXT)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _translate_vpmems_request(self, flavor):"},{"line_number":186,"context_line":"        \"\"\"When the hw:pmem extra spec, require hosts which can provide"},{"line_number":187,"context_line":"        enough vpmem resources."},{"line_number":188,"context_line":"        \"\"\""},{"line_number":189,"context_line":"        vpmem_labels \u003d hw.get_vpmems(flavor)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_ff580c57","line":186,"range":{"start_line":186,"start_character":38,"end_line":186,"end_character":39},"updated":"2019-09-06 23:09:55.000000000","message":"...is present","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"4a58091503b17f63041c8ba5d0920dbf1f36674e","unresolved":false,"context_lines":[{"line_number":183,"context_line":"                  orc.MEM_ENCRYPTION_CONTEXT)"},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"    def _translate_vpmems_request(self, flavor):"},{"line_number":186,"context_line":"        \"\"\"When the hw:pmem extra spec, require hosts which can provide"},{"line_number":187,"context_line":"        enough vpmem resources."},{"line_number":188,"context_line":"        \"\"\""},{"line_number":189,"context_line":"        vpmem_labels \u003d hw.get_vpmems(flavor)"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_1202b1b5","line":186,"range":{"start_line":186,"start_character":38,"end_line":186,"end_character":39},"in_reply_to":"5faad753_ff580c57","updated":"2019-09-09 05:46:36.000000000","message":"Done","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"df9c0037889457802ae0e8ed3ca950343a511945","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"},{"line_number":200,"context_line":"            LOG.debug(\"Add resource %s\u003d%d to requested resources\","},{"line_number":201,"context_line":"                      resource_class, amount)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_b2fe4b03","line":200,"range":{"start_line":200,"start_character":23,"end_line":200,"end_character":26},"updated":"2019-09-06 23:09:55.000000000","message":"\"Added\" (consistent with previous method)","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"4a58091503b17f63041c8ba5d0920dbf1f36674e","unresolved":false,"context_lines":[{"line_number":197,"context_line":"            amount_by_rc[resource_class] +\u003d 1"},{"line_number":198,"context_line":"        for resource_class, amount in amount_by_rc.items():"},{"line_number":199,"context_line":"            self._add_resource(None, resource_class, amount)"},{"line_number":200,"context_line":"            LOG.debug(\"Add resource %s\u003d%d to requested resources\","},{"line_number":201,"context_line":"                      resource_class, amount)"},{"line_number":202,"context_line":""},{"line_number":203,"context_line":"    @property"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_32ffadab","line":200,"range":{"start_line":200,"start_character":23,"end_line":200,"end_character":26},"in_reply_to":"5faad753_b2fe4b03","updated":"2019-09-09 05:46:36.000000000","message":"Done","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"48f3fdce55933293d237ab644a360ed3ccc9584c","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Utility methods for scheduling.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import collections"},{"line_number":18,"context_line":"import os_resource_classes"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import sys"},{"line_number":21,"context_line":"import traceback"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_c4ee6ab3","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":26},"updated":"2019-09-10 17:04:27.000000000","message":"Deja","commit_id":"679cf344d65d3a59553980947ea1fb1151ed1887"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"3f6d66e020addfd578be221595fad32201cfd90f","unresolved":false,"context_lines":[{"line_number":15,"context_line":"\"\"\"Utility methods for scheduling.\"\"\""},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"import collections"},{"line_number":18,"context_line":"import os_resource_classes"},{"line_number":19,"context_line":"import re"},{"line_number":20,"context_line":"import sys"},{"line_number":21,"context_line":"import traceback"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_a9e45aad","line":18,"range":{"start_line":18,"start_character":0,"end_line":18,"end_character":26},"in_reply_to":"5faad753_c4ee6ab3","updated":"2019-09-11 08:13:49.000000000","message":"Done","commit_id":"679cf344d65d3a59553980947ea1fb1151ed1887"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"48f3fdce55933293d237ab644a360ed3ccc9584c","unresolved":false,"context_lines":[{"line_number":20,"context_line":"import sys"},{"line_number":21,"context_line":"import traceback"},{"line_number":22,"context_line":""},{"line_number":23,"context_line":"import os_resource_classes as orc"},{"line_number":24,"context_line":"from oslo_log import log as logging"},{"line_number":25,"context_line":"from oslo_serialization import jsonutils"},{"line_number":26,"context_line":"from six.moves.urllib import parse"}],"source_content_type":"text/x-python","patch_set":26,"id":"5faad753_842e32f8","line":23,"range":{"start_line":23,"start_character":0,"end_line":23,"end_character":33},"updated":"2019-09-10 17:04:27.000000000","message":"Vu","commit_id":"679cf344d65d3a59553980947ea1fb1151ed1887"}],"nova/tests/unit/scheduler/test_utils.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"aad23552481ef168820d4523e7f4680ffa93c216","unresolved":false,"context_lines":[{"line_number":909,"context_line":"    def test_resource_request_with_vpmems(self):"},{"line_number":910,"context_line":"        flavor \u003d objects.Flavor("},{"line_number":911,"context_line":"            vcpus\u003d1, memory_mb\u003d1024, root_gb\u003d10, ephemeral_gb\u003d5, swap\u003d0,"},{"line_number":912,"context_line":"            extra_specs\u003d{\u0027hw:pmem\u0027: \u00274GB, 4GB,SMALL\u0027})"},{"line_number":913,"context_line":""},{"line_number":914,"context_line":"        expected \u003d FakeResourceRequest()"},{"line_number":915,"context_line":"        expected._rg_by_id[None] \u003d objects.RequestGroup("}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_00e553a8","line":912,"range":{"start_line":912,"start_character":41,"end_line":912,"end_character":42},"updated":"2019-09-10 14:33:12.000000000","message":"✔","commit_id":"71a70443e0cd52ecf22324e448d04985ea14feb6"}],"nova/virt/hardware.py":[{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"67c046812ee696abe20877cea40af9d5d0ac9282","unresolved":false,"context_lines":[{"line_number":1942,"context_line":"        return []"},{"line_number":1943,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":1944,"context_line":"    for vpmem_label in vpmem_labels:"},{"line_number":1945,"context_line":"        if not vpmem_label.isalnum():"},{"line_number":1946,"context_line":"            raise exception.InvalidVPMEMConfig(vpmem_label\u003dvpmem_label)"},{"line_number":1947,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_becbfb6f","line":1946,"range":{"start_line":1945,"start_character":8,"end_line":1946,"end_character":71},"updated":"2019-08-30 21:01:55.000000000","message":"meh, not sure I would bother with this.\n\n(bit if you do, it should be tested)","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"067deece6ce727d7a121b8a5bbaf9c515a5f48d6","unresolved":false,"context_lines":[{"line_number":1942,"context_line":"        return []"},{"line_number":1943,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":1944,"context_line":"    for vpmem_label in vpmem_labels:"},{"line_number":1945,"context_line":"        if not vpmem_label.isalnum():"},{"line_number":1946,"context_line":"            raise exception.InvalidVPMEMConfig(vpmem_label\u003dvpmem_label)"},{"line_number":1947,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":10,"id":"7faddb67_c37a90b9","line":1946,"range":{"start_line":1945,"start_character":8,"end_line":1946,"end_character":71},"in_reply_to":"7faddb67_becbfb6f","updated":"2019-09-02 13:02:10.000000000","message":"remove this","commit_id":"9847507d533b07313a33b4397744a4588194134f"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b878e70c9a7007b7c95a2ba7d00fc3ffc4576f2a","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_1d4795a5","line":2033,"range":{"start_line":2033,"start_character":0,"end_line":2033,"end_character":41},"updated":"2019-09-03 16:43:32.000000000","message":"Are these completely free-form? Shouldn\u0027t you check for invalid characters? Perhaps only allow ASCII and underscore (i.e. slugs in Django parlance [1])?\n\n[1] https://stackoverflow.com/questions/427102/what-is-a-slug-in-django","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"b878e70c9a7007b7c95a2ba7d00fc3ffc4576f2a","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"    :param flavor: a flavor object to read extra specs from"},{"line_number":2028,"context_line":"    :returns: a vpmem label list"},{"line_number":2029,"context_line":"    \"\"\""},{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_bd60c136","line":2033,"range":{"start_line":2030,"start_character":0,"end_line":2033,"end_character":41},"updated":"2019-09-03 16:43:32.000000000","message":"nit: I assume you can pass a default to that second \u0027get\u0027 so...\n\n    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027, \u0027\u0027)\n    return vpmems_info.split(\u0027,\u0027)","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"e37a982248e9d800ce7f0e8e5ce054ebdc2ed03a","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_93c0464c","line":2033,"range":{"start_line":2033,"start_character":0,"end_line":2033,"end_character":41},"in_reply_to":"7faddb67_1d4795a5","updated":"2019-09-04 12:53:30.000000000","message":"The label is a part of resource class, so we can rely on os_traits.normalize_name method to normalize it.","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"e37a982248e9d800ce7f0e8e5ce054ebdc2ed03a","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"    :param flavor: a flavor object to read extra specs from"},{"line_number":2028,"context_line":"    :returns: a vpmem label list"},{"line_number":2029,"context_line":"    \"\"\""},{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_33a152aa","line":2033,"range":{"start_line":2030,"start_character":0,"end_line":2033,"end_character":41},"in_reply_to":"7faddb67_bd60c136","updated":"2019-09-04 12:53:30.000000000","message":"Done","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"7e4cf754a38a6fba82f5d515b695a2ac3986e964","unresolved":false,"context_lines":[{"line_number":2027,"context_line":"    :param flavor: a flavor object to read extra specs from"},{"line_number":2028,"context_line":"    :returns: a vpmem label list"},{"line_number":2029,"context_line":"    \"\"\""},{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":13,"id":"7faddb67_76a24741","line":2033,"range":{"start_line":2030,"start_character":0,"end_line":2033,"end_character":41},"in_reply_to":"7faddb67_bd60c136","updated":"2019-09-05 02:03:02.000000000","message":"if vpmem_info is \u0027\u0027, we will get [\u0027\u0027] from vpmems_info.split(\u0027,\u0027), it\u0027s not we want.","commit_id":"ac7e7c5a24e8e7f1fc086b01738af262a6fc950d"},{"author":{"_account_id":5754,"name":"Alex Xu","email":"hejie.xu@intel.com","username":"xuhj"},"change_message_id":"7eba16bfbb706ce3ddefc3d1650db2b2293d06e7","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_072e3b42","line":2033,"updated":"2019-09-05 06:12:29.000000000","message":"we should do some check, like I can input \"hw:pmem\u003d,,,\", we should strip all the empty one.","commit_id":"0b83d1f15b071dd89360470ce373220cffbd053b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"790fcc5e88171f3174ba78a1813ea8d40cbccfb9","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":17,"id":"7faddb67_1d344efa","line":2033,"in_reply_to":"7faddb67_072e3b42","updated":"2019-09-05 10:37:44.000000000","message":"Or we can let placement tell the user \"we don\u0027t have this resource class\"?","commit_id":"0b83d1f15b071dd89360470ce373220cffbd053b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"df9c0037889457802ae0e8ed3ca950343a511945","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_f2492360","line":2033,"updated":"2019-09-06 23:09:55.000000000","message":"These should probably also be whitespace-trimmed. normalize_name will translate whitespace characters to underscores, which will lead to somewhat confusing failures. It\u0027s the admin\u0027s fault, yes, but in this case it\u0027s easy to accommodate.","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"4a58091503b17f63041c8ba5d0920dbf1f36674e","unresolved":false,"context_lines":[{"line_number":2030,"context_line":"    vpmems_info \u003d flavor.get(\u0027extra_specs\u0027, {}).get(\u0027hw:pmem\u0027)"},{"line_number":2031,"context_line":"    if not vpmems_info:"},{"line_number":2032,"context_line":"        return []"},{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    return vpmem_labels"}],"source_content_type":"text/x-python","patch_set":22,"id":"5faad753_1277113d","line":2033,"in_reply_to":"5faad753_f2492360","updated":"2019-09-09 05:46:36.000000000","message":"Since Alex, stephen also give some comments about this, I would like do some check here, and do nothing to handle the original input, just raise a exception to inform admin to correct the flavor config. And also add a unittest for this case.","commit_id":"974da4d2ae15f1d8300cd7c9b0eda010e09ebd0b"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"af1a42f0b01fdbbeb3e37207054923d04085d6c3","unresolved":false,"context_lines":[{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    malformed_labels \u003d []"},{"line_number":2035,"context_line":"    for label in vpmem_labels:"},{"line_number":2036,"context_line":"        if not label.isalnum():"},{"line_number":2037,"context_line":"            malformed_labels.append(label)"},{"line_number":2038,"context_line":"    if malformed_labels:"},{"line_number":2039,"context_line":"        raise exception.InvalidVPMEMConfig(vpmem_label\u003dmalformed_labels)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_14ddab13","line":2036,"range":{"start_line":2036,"start_character":21,"end_line":2036,"end_character":28},"updated":"2019-09-09 21:55:06.000000000","message":"This is overly restrictive. Labels should be allowed to have underscores as well.\n\nBut I don\u0027t think you should be doing validation on this side -- just let Placement do it.\n\nThe only thing you should be doing is trimming whitespace.","commit_id":"88a115a20b7b54e2ddad75a92bf70b5d20335445"},{"author":{"_account_id":23598,"name":"Zhong Luyao","email":"luyao.zhong@intel.com","username":"ZhongLuyao"},"change_message_id":"d5a78d7a5a4a19d15be49c4f2ce72a7bdcbbc364","unresolved":false,"context_lines":[{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    malformed_labels \u003d []"},{"line_number":2035,"context_line":"    for label in vpmem_labels:"},{"line_number":2036,"context_line":"        if not label.isalnum():"},{"line_number":2037,"context_line":"            malformed_labels.append(label)"},{"line_number":2038,"context_line":"    if malformed_labels:"},{"line_number":2039,"context_line":"        raise exception.InvalidVPMEMConfig(vpmem_label\u003dmalformed_labels)"}],"source_content_type":"text/x-python","patch_set":23,"id":"5faad753_73e0b0fb","line":2036,"range":{"start_line":2036,"start_character":21,"end_line":2036,"end_character":28},"in_reply_to":"5faad753_14ddab13","updated":"2019-09-10 06:16:59.000000000","message":"Done","commit_id":"88a115a20b7b54e2ddad75a92bf70b5d20335445"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"aad23552481ef168820d4523e7f4680ffa93c216","unresolved":false,"context_lines":[{"line_number":2033,"context_line":"    vpmem_labels \u003d vpmems_info.split(\u0027,\u0027)"},{"line_number":2034,"context_line":"    formed_labels \u003d []"},{"line_number":2035,"context_line":"    for label in vpmem_labels:"},{"line_number":2036,"context_line":"        formed_label \u003d label.replace(\u0027 \u0027, \u0027\u0027)"},{"line_number":2037,"context_line":"        if formed_label:"},{"line_number":2038,"context_line":"            formed_labels.append(formed_label)"},{"line_number":2039,"context_line":"    return formed_labels"}],"source_content_type":"text/x-python","patch_set":25,"id":"5faad753_2072cf12","line":2036,"range":{"start_line":2036,"start_character":23,"end_line":2036,"end_character":45},"updated":"2019-09-10 14:33:12.000000000","message":"This will also eliminate internal spaces, which is probably not a good thing. Just use\n\n label.strip()","commit_id":"71a70443e0cd52ecf22324e448d04985ea14feb6"},{"author":{"_account_id":15334,"name":"Stephen Finucane","display_name":"stephenfin","email":"stephenfin@redhat.com","username":"sfinucan"},"change_message_id":"48f3fdce55933293d237ab644a360ed3ccc9584c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5faad753_0451e262","line":2040,"updated":"2019-09-10 17:04:27.000000000","message":"nit: I\u0027m still not sure if this is good enough as far as normalization goes. I know we have a call to the \u0027normalize_name\u0027 function in the caller for this but I\u0027d much rather explicitly reject requests that included invalid characters rather than munge them like this. I guess if others think it\u0027s okay though, I can live with it","commit_id":"679cf344d65d3a59553980947ea1fb1151ed1887"},{"author":{"_account_id":14070,"name":"Eric Fried","email":"openstack@fried.cc","username":"efried"},"change_message_id":"e6928e18d0a577e8b54a3cc4a87ec28806fd9c96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"5faad753_24465e7e","line":2040,"in_reply_to":"5faad753_0451e262","updated":"2019-09-10 17:09:36.000000000","message":"Right, the reason I wanted to strip (surrounding) whitespace is because\n\n \u0027hw:pmem\u0027: \u0027one, two, three\u0027\n\nshould clearly be interpreted as\n\n [\u0027one\u0027, \u0027two\u0027, \u0027three\u0027]\n\nand not\n\n [\u0027one\u0027, \u0027 two\u0027, \u0027 three\u0027]\n\nbut anything else should be 1) scrubbed by normalize_name and 2) allowed to fail in placement if it\u0027s bogus.\n\nI suppose a comment to that effect wouldn\u0027t go astray.","commit_id":"679cf344d65d3a59553980947ea1fb1151ed1887"}]}
